java - 锁和 .join() 方法之间的区别

标签 java multithreading

假设您有两个线程: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/

相关文章:

asp.net-mvc - 在 ASP.NET MVC 中异步使用 WebClient?

java - 从 BLE 设备读取/写入自定义特性

java - 共享首选项 edittext settext 错误

java - 如何将 HashSet 放置在 HashMap 中?

Java ExecutorService : awaitTermination of all recursively created tasks

c - linux fcntl 文件锁定超时

java - 多线程应用程序中的 ShutDownHook

java - 如何在 Java 8 中超时后终止异步运行的线程以及这样做的含义

java - 有多少 Java SE api 是用 Java 编写的?

c# - 如何杀死主线程?