Java线程同步的方法
到底是synchronized和otatile,还是wait、sleep、notify、notifyall这两种回答到底哪个准确一点?...
到底是synchronized和otatile,还是wait、sleep、notify、notifyall
这两种回答到底哪个准确一点? 展开
这两种回答到底哪个准确一点? 展开
8个回答
展开全部
等待唤醒机制
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.
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.
展开全部
线程同步有两种方法:同步代码块和同步方法,用synochronized来修饰。
线程同步就是使用线程同时运行多个任务时,使用这样的锁机制来实现。这就关系到了线程之间的先后执行,相互协调,为了使线程之间的执行不会相互产生影响,更好的通信,so这些方法 wait(),sleep(),notify(),notifyall(),就自然而然的产生了。
线程同步就是使用线程同时运行多个任务时,使用这样的锁机制来实现。这就关系到了线程之间的先后执行,相互协调,为了使线程之间的执行不会相互产生影响,更好的通信,so这些方法 wait(),sleep(),notify(),notifyall(),就自然而然的产生了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一般在JAVA线程中,我们采用 synchronized {...} 或 synchronized方法去描述一块语句为同步语句块,用synchronized包裹的语句在多个线程同时运行时只会有一个线程执行该段语句块,在使用synchronized关键字时候,应该尽可能避免在synchronized方法或synchronized块中使用sleep或者yield方法,因为synchronized程序块占有着对象锁,你休息那么其他的线程只能一边等着你醒来执行完了才能执行。不但严重影响效率,也不合逻辑。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你们几个回答我都没看懂,同步就是synchronized,是让所有的线程执行一个代码段之前排队,一个一个去执行这个代码段。
好像路边的公共厕所,一间只能一个人上。外面不管有多少人排队,里面那个人出来,才能再进去一个人。
好像路边的公共厕所,一间只能一个人上。外面不管有多少人排队,里面那个人出来,才能再进去一个人。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1、使用synchronized对整个方法同步
2、使用线程安全的类,例如Hashtable,或者Collections中的同步list或者map
2、使用线程安全的类,例如Hashtable,或者Collections中的同步list或者map
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询