我是Java多线程的新手,我想看看我的推理是否正确。
据我了解,wait()
和notify()
不是线程安全的方法(继承自类Object
),因此,为了使它们正常工作,任何设计都需要它们在同步区块内。
另一方面,来自lock()
班级的unlock()
和ReentrantLock()
,来自await()
班级的signal()
和ReentrantLock.Condition
,{{1}来自acquire()
的{{1}}和release()
似乎是更高级的构造,无需同步块即可使用。据我所料,这应该是可能的,因为所有这些方法本身都是线程安全的。
这是对的吗?
**编辑:**如果对象Semaphore
由不同的线程通过obj
访问,那么obj.x()
是线程安全的,如果不同的线程在执行时不能交错;因此,如果一个线程开始执行obj.x()
,则此调用是原子的,并且任何其他线程将被置于执行该方法的保持状态。
答案 0 :(得分:0)
您枚举的所有方法都不是synchronized
或使用synchronized
块。然而,它们都应该在多线程环境中调用,因此它们提供了安全执行此操作的方法。
您可以使用除java.util.concurrent
和Condition.await()
之外的所有Condition.signal()
方法,而无需保留任何锁定。
await()
和signal()
大致等同于Object.wait()
和Object.notify()
,因此对于Condition
接口的几乎所有JDK实现,您都可以使用需要保持与条件变量关联的锁。您枚举的所有java.util.concurrent
方法都依赖于名为java.util.concurrent
的{{1}}包的基本构建块。它是一个非常复杂的东西(它有一个whitepaper)可以提供AbstractQueuedSynchronizer
方法或块的功能以及一些额外的好东西。
P.S。我假设您的意思是synchronized
而不是Semaphore.release()
。
答案 1 :(得分:0)
如果obj.x()通过不同的线程访问对象obj,那么如果不同的线程在执行时不能交错,则obj.x()是线程安全的;所以如果一个线程开始执行obj。
这不是线程安全的意思。你所描述的是一种被称为互斥的财产。这既不是必要的,也不足以保证真正的线程安全。
事实上,线程安全性很难定义。实际上,您需要从代码的一部分和相应的代码正确性规范开始。
当使用单个线程执行时,假设代码根据规范是正确的。
然后我们可以说代码是线程安全的如果根据规范对于使用多个线程的所有可能执行也是正确的。
无论如何,通过接受的线程安全定义,您列出的所有方法都是线程安全的。 (如果不是,那么它们将毫无用处。)
但请注意,这并不意味着使用这些方法的所有内容都是自动线程安全的。它们必须以正确的方式使用。