锁定是关于保护共享数据。
锁位于要保护的数据结构上。线程是访问数据结构的事物。锁位于数据结构对象上,以防止线程以不安全的方式访问数据结构。
任何对象都可以用作内部锁(与结合使用
synchronized)。这样,您可以通过将synced修饰符添加到访问共享数据的方法中来保护对任何对象的访问。
该
wait和
notify方法被称为上正在使用的锁对象。锁是共享的通信点:
当有锁的线程调用
notifyAll
它时,等待同一锁的其他线程将收到通知。当具有锁的线程调用notify
它时,等待同一锁的线程之一将收到通知。当有锁
wait
的线程调用它时,该线程释放锁并进入休眠状态,直到a)收到通知,或b)任意唤醒(“虚假唤醒”);或者 由于这两个原因之一,等待线程仍停留在调用中,直到它唤醒为止,然后线程必须重新获取锁,然后才能退出wait方法。
请参阅有关受保护块的Oracle教程,Drop类是共享的数据结构,使用Producer和Consumer可运行对象的线程正在访问它。锁定Drop对象将控制线程如何访问Drop对象的数据。
线程在JVM实现中用作锁,建议应用程序开发人员避免将线程用作锁。例如,Thread.join的文档说:
此实现使用以this.isAlive为条件的this.wait调用循环。当线程终止时,将调用this.notifyAll方法。建议应用程序不要在线程实例上使用wait,notify或notifyAll。
Java
5引入了显式锁实现
java.util.concurrent.locks.Lock。它们比隐式锁更灵活。有一些类似于等待和通知的方法(等待和信号),但是它们是在Condition而不是在锁上的。具有多个条件使仅针对那些正在等待特定类型通知的线程成为可能。



