- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Java实用教程第15讲Java多线程(二)
* 第15讲 Java多线程(二) 15.1 访问共享资源 15.2 线程间协作 15.3 死锁 15.4 本讲小结 将一个任务拆分成多个独立执行的子任务,这些子任务可以并行执行,这是使用Java多线程编程的好处,但这些子任务同时访问一个资源时,就会造成访问的冲突,在解决冲突时还要避免产生死锁,另外,有时多个子任务之间需要协调通信来共同完成一个任务。 15.1 访问共享资源 多个线程同时访问同一存储空间时可能会出现访问冲突。如:两个线程访问同一个对象时,一个线程向对象中存储数据,另一个线程读取该数据。当第一个线程还没有完成存储操作时,第二个线程就开始读取数据,这时会产生了混乱。 15.1.1 访问冲突 考虑下面的程序: AccessConflict.java class DataClass{ private int data=0; public void increase(){ int nd=data; try{ Thread.sleep(100); } catch (Exception e){} data=nd+1; } public int getData(){ return data; } }; class NThread extends Thread{ DataClass d; NThread(DataClass d){ this.d=d; } boolean alive=true; public void run(){ for(int i=0;i100;i++){ d.increase(); } alive=false; } }; public class AccessConflict { public static void main(String[] args){ DataClass d=new DataClass(); NThread t1=new NThread(d); NThread t2=new NThread(d); t1.start(); t2.start(); while(t1.alive||t2.alive); System.out.println(data=+d.getData()); } } 15.1.2 解决冲突 防止冲突的方法就是当资源被一个线程访问时,为这个资源加锁。 Java使用关键字synchronized来实现这一过程。 使用关键字synchronized修饰的方法称为同步方法,当线程调用非静态的synchronized方法时,自动获得synchronized所标示的与正在执行代码类的当前实例(this实例)有关的锁。获得一个对象的锁也称为获取锁、锁定对象、在对象上锁定或在对象上同步。 关键字synchronized可以修饰方法 一个对象只有一个锁。所以,如果一个线程获得该锁,这时其它线程要想获得该对象的锁就必须等待,直到第一个线程释放(或返回)锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块,直到该锁被释放。 同步时所注意的问题: (1)当程序运行到synchronized同步方法或代码块时才该对象锁才起作用; (2)使用private修饰域,可以防止其它线程直接访问域; (3)线程睡眠时,它所持的任何锁都不会释放; (4)一个线程可以同时获得多个锁; (5)同步方法虽然可以解决同步问题,但也存在缺陷,如果一个同步方法需要执行的时间很长,将会大大影响系统的效率,这时进来使用synchronized块。 15.1.3 静态方法同步 synchronized 修饰的静态方法可以在类的范围内防止对static数据的并发访问,如: public synchronized static void f(){} synchronized 修饰的静态方法属于某个类的范围,防止多个线程同时访问这个类中的synchronized 修饰的静态方法,它可以对类的所有对象实例起作用。而synchronized的实例方法是某实例的范围,它防止多个线程同时访问这个实例中的synchronized方法。 15.2 线程间协作 可以使用锁(互斥)来同步多个线程,那么如何实现多个线程间的协作呢?多个线程协作的关键在于它们之间的相互通信。互斥可以保证同一时刻只有一个线程相应某个信号,在互斥的基础上再添加某种途径,可以使线程本身挂起,直到某些条件发生变化再转入就绪状态。 线程间的通信通过“等待-通知”机制来实现,Object类中的wait()和notify()方法实现了这种机制。 wait()方法可以使线程等待某个条件发生
您可能关注的文档
- Dealing With AIDS 大学英语精读 教学课件.ppt
- Deductive Research 大学论文写作课课件(英文).ppt
- denisi_HR_1e_PPTs_ch02 人力资源管理 外教 课件.ppt
- denisi_HR_1e_PPTs_ch01 人力资源管理 外教 课件.ppt
- denisi_HR_1e_PPTs_ch05 人力资源管理 外教 课件.ppt
- denisi_HR_1e_PPTs_ch06 人力资源管理 外教 课件.ppt
- denisi_HR_1e_PPTs_ch07 人力资源管理 外教 课件.ppt
- DES 信息安全概论课件与复习提纲.ppt
- Deutschland 德语教学课件.doc
- Dickinson 高等教育出版社 美国文学选读课件.ppt
文档评论(0)