Locks和.join()方法之间的区别

假设你有两个线程,thread1和thread2。如果同时调用thread1.start()和thread2.start()并且它们都打印出1到5之间的数字,它们将同时运行,并且它们将以任何顺序随机打印出数字,如果我没弄错。要防止这种情况,请使用.join()方法确保首先执行某个线程。如果这是.join()方法的作用,那么Lock对象用于什么?



小怪兽爱吃肉
浏览 447回答 2
2回答

四季花海

Thread.join用于等待另一个线程完成。join方法使用Thread对象上的隐式锁定并对其进行调用wait。当线程等待完成时,它通知等待线程,因此它可以停止等待。Java有不同的方法来使用锁来保护对数据的访问。隐式锁定使用内置于每个Java对象中的锁(这是synchronized关键字所在的位置),然后是显式锁对象。它们都保护数据不受并发访问的影响,不同之处在于显式锁定更灵活,功能更强大,而隐式锁定则更易于使用。例如,使用隐式锁定,我无法在同步方法或块的末尾释放锁定,JVM确保在线程离开时释放锁定。但使用隐式锁编程可能会受到限制。例如,没有单独的条件对象,因此如果存在针对不同事物访问共享对象的不同线程,则不可能仅通知它们的子集。使用显式锁定,您可以获得单独的条件对象,并且只能通知那些在特定条件下等待的线程(生成器可能在一个条件下等待,而消费者在另一个条件上等待,请参阅ArrayBlockingQueue类以获取示例),并且您可以实现更多涉及的模式,就像手动锁定一样。但是你需要更加小心,因为额外的功能带来了复杂性,释放锁定取决于你。

莫回无

锁定通常会阻止多个线程同时运行代码块。这是因为一次只有一个线程可以获取锁并在其中运行代码。如果一个线程想要锁定但是它已被占用,则该线程进入等待状态直到锁定被释放。如果你有许多线程在等待释放锁,那么下一个获得锁的是INDETERMINATE(无法预测)。这可能导致线程等待锁定的“线程饥饿”,但它永远不会得到它,因为其他线程似乎总是得到它。这是一个非常通用的答案,因为您没有指定语言。有些语言可能略有不同,因为它们可能有一种确定方法来决定接下来是谁获得锁定。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java