java多线程同步(waitnotifynotifyall)

java多线程同步(waitnotifynotifyall)

ID:8817107

大小:22.20 KB

页数:4页

时间:2018-04-08

java多线程同步(waitnotifynotifyall)_第1页
java多线程同步(waitnotifynotifyall)_第2页
java多线程同步(waitnotifynotifyall)_第3页
java多线程同步(waitnotifynotifyall)_第4页
资源描述:

《java多线程同步(waitnotifynotifyall)》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、关于JAVA多线程同步1wait方法:该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所在的代码块的锁,并在其他线程调用notify或者notifyAll方法时恢复到竞争锁状态(一旦获得锁就恢复执行)。调用wait方法需要注意几点:第一点:wait被调用的时候必须在拥有锁(即synchronized修饰的)的代码块中。第二点:恢复执行后,从wait的下一条语句开始执行,因而wait方法总是应当在while循环中调用,以免出现恢复执行后继续执行的条件不满足却继续执行的情况

2、。第三点:若wait方法参数中带时间,则除了notify和notifyAll被调用能激活处于wait状态(等待状态)的线程进入锁竞争外,在其他线程中interrupt它或者参数时间到了之后,该线程也将被激活到竞争状态。第四点:wait方法被调用的线程必须获得之前执行到wait时释放掉的锁重新获得才能够恢复执行。2notify方法和notifyAll方法:notify方法通知调用了wait方法,但是尚未激活的一个线程进入线程调度队列(即进入锁竞争),注意不是立即执行。并且具体是哪一个线程不能保证。另外一点就是被唤醒的这个线程一定是在等待wait所释放的锁。n

3、otifyAll方法则唤醒所有调用了wait方法,尚未激活的进程进入竞争队列。3synchronized关键字:第一点:synchronized用来标识一个普通方法时,表示一个线程要执行该方法,必须取得该方法所在的对象的锁。第二点:synchronized用来标识一个静态方法时,表示一个线程要执行该方法,必须获得该方法所在的类的类锁。第三点:synchronized修饰一个代码块。类似这样:synchronized(obj){//code....}。表示一个线程要执行该代码块,必须获得obj的锁。这样做的目的是减小锁的粒度,保证当不同块所需的锁不冲突时不用

4、对整个对象加锁。利用零长度的byte数组对象做obj非常经济。4atomicaction(原子操作):在JAVA中,以下两点操作是原子操作。但是c和c++中并不如此。第一点:对引用变量和除了long和double之外的原始数据类型变量进行读写。第二点:对所有声明为volatile的变量(包括long和double)的读写。另外:在java.util.concurrent和java.util.concurrent.atomic包中提供了一些不依赖于同步机制的线程安全的类和方法。5一个例子,该例子模仿多人存取同一个账户:Account类:packagecom.

5、synchronize;importjava.util.HashMap;importjava.util.Iterator;publicclassAccount{privatestaticHashMapm=newHashMap();privatestaticlongtimes=0;static{m.put("ren",1000);}publicsynchronizedvoidsave(Stringname,intnum){longtempTime=times++;System.out.print

6、ln("第"+tempTime+"次存储"+num+"之前"+name+"的余额为:"+m.get(name));m.put(name,m.get(name)+num);this.notify();System.out.println("第"+tempTime+"次存储"+num+"之后"+name+"的余额为:"+m.get(name));}publicstaticintget(Stringname){returnm.get(name);}/***注意wait的用法,必须在loop中,必须在拥有锁的代码块中。前者是当被notify的时候要重新进行条件判断

7、,后者是为了释放锁。**@paramname*@paramnum*/publicsynchronizedvoidload(Stringname,intnum){longtempTime=times++;System.out.println("第"+tempTime+"次提取"+num+"之前"+name+"的余额为:"+m.get(name));try{while(m.get(name)

8、();System.out.println("第"+tempTim

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。