发布网友 发布时间:2022-04-22 01:03
共5个回答
热心网友 时间:2023-09-10 19:30
等待唤醒机制
wait():让线程等待。将线程存储到一个线程池中。
notify():唤醒被等待的线程。通常都唤醒线程池中的第一个。让被唤醒的线程处于临时阻塞状态。
notifyAll(): 唤醒所有的等待线程。将线程池中的所有线程都唤醒,让它们从冻结状体转到临时阻塞状态.
这三个方法用于操作线程,可是定义在了Object类中,为什么呢?
因为,这三个方法在使用时,都需要定义在同步中,要明确这些方法所操作的线程所属于锁。
简单说。在A锁被wait的线程,只能被A锁的notify方法唤醒。
所以必须要表示wait notify方法所属的锁对象,而锁对象可以是任意的对象。
可以被任意的对象调用的方法肯定定义在Object类中。
注意:等待唤醒机制,通常都用在同步中,因为需要锁的支持。
而且必须要明确wait notify 所作用的锁对象。
JDK1.5后的锁
在jdk1.5版本之后,
出现了一些新的特性,将原理的线程进行了改良。
在java.util.concurrent.locks包中提供了一个接口Lock。替代了synchronized。
synchronized。使用的是锁操作是隐式的。
Lock接口,使用的锁操作是显示的。
由两个方法来完成:
lock():获取锁。
unlock():释放锁。
还有一个对象,Condition.
该对象的出现替代了Object中的wait notify notifyAll这些操作监视器的方法。
替代后的方式:await signal signalAll.
热心网友 时间:2023-09-10 19:30
线程同步有两种方法:同步代码块和同步方法,用synochronized来修饰。
线程同步就是使用线程同时运行多个任务时,使用这样的锁机制来实现。这就关系到了线程之间的先后执行,相互协调,为了使线程之间的执行不会相互产生影响,更好的通信,so这些方法 wait(),sleep(),notify(),notifyall(),就自然而然的产生了。
热心网友 时间:2023-09-10 19:31
一般在JAVA线程中,我们采用 synchronized {...} 或 synchronized方法去描述一块语句为同步语句块,用synchronized包裹的语句在多个线程同时运行时只会有一个线程执行该段语句块,在使用synchronized关键字时候,应该尽可能避免在synchronized方法或synchronized块中使用sleep或者yield方法,因为synchronized程序块占有着对象锁,你休息那么其他的线程只能一边等着你醒来执行完了才能执行。不但严重影响效率,也不合逻辑。
热心网友 时间:2023-09-10 19:31
你们几个回答我都没看懂,同步就是synchronized,是让所有的线程执行一个代码段之前排队,一个一个去执行这个代码段。
好像路边的公共厕所,一间只能一个人上。外面不管有多少人排队,里面那个人出来,才能再进去一个人。
热心网友 时间:2023-09-10 19:32
1、使用synchronized对整个方法同步
2、使用线程安全的类,例如Hashtable,或者Collections中的同步list或者map