假设您有两个线程:thread1 和 thread2。如果你同时调用 thread1.start() 和 thread2.start() 并且它们都打印出 1 到 5 之间的数字,它们将同时运行,并且它们会以任意顺序随机打印出数字,如果我没有看错。为了防止这种情况,您可以使用 .join() 方法来确保首先执行某个线程。如果这就是 .join() 方法的作用,那么 Lock 对象是用来做什么的?
最佳答案
Thread.join 用于等待另一个线程完成。 join 方法使用 Thread 对象上的隐式锁并对其调用 wait。当正在等待的线程完成时,它会通知等待线程,以便它可以停止等待。
Java 有不同的方式使用锁来保护对数据的访问。有隐式锁定,它使用内置于每个 Java 对象中的锁(这就是同步关键字出现的地方),还有显式 Lock 对象。它们都保护数据免受并发访问,不同之处在于显式锁更加灵活和强大,而隐式锁被设计为更易于使用。
例如,对于隐式锁,我无法在同步方法或 block 结束时释放锁,JVM 确保在线程离开时释放锁。但使用隐式锁进行编程可能会受到限制。例如,没有单独的条件对象,因此如果有不同的线程为不同的事情访问共享对象,则不可能只通知其中的一个子集。使用显式锁,您可以获得单独的条件对象,并且只能通知那些等待特定条件的线程(生产者可能等待一个条件,而消费者等待另一个条件,请参阅 ArrayBlockingQueue 类以获取示例),并且您可以实现更多涉及的内容各种模式,例如手拉手锁定。但您需要更加小心,因为额外的功能会带来复杂性,并且释放锁定取决于您。
关于java - 锁和 .join() 方法之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56102580/