Java实用教程第15讲Java多线程(二)

Java实用教程第15讲Java多线程(二)

ID:41323909

大小:351.31 KB

页数:16页

时间:2019-08-22

Java实用教程第15讲Java多线程(二)_第1页
Java实用教程第15讲Java多线程(二)_第2页
Java实用教程第15讲Java多线程(二)_第3页
Java实用教程第15讲Java多线程(二)_第4页
Java实用教程第15讲Java多线程(二)_第5页
资源描述:

《Java实用教程第15讲Java多线程(二)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第15讲Java多线程(二)15.1访问共享资源15.2线程间协作15.3死锁15.4本讲小结将一个任务拆分成多个独立执行的子任务,这些子任务可以并行执行,这是使用Java多线程编程的好处,但这些子任务同时访问一个资源时,就会造成访问的冲突,在解决冲突时还要避免产生死锁,另外,有时多个子任务之间需要协调通信来共同完成一个任务。15.1访问共享资源多个线程同时访问同一存储空间时可能会出现访问冲突。如:两个线程访问同一个对象时,一个线程向对象中存储数据,另一个线程读取该数据。当第一个线程还没有完成存储操作时,第二个线程就开始读取数据,这时会产生了混乱。15.1.1访问冲突考虑下

2、面的程序:AccessConflict.javaclassDataClass{privateintdata=0;publicvoidincrease(){intnd=data;try{Thread.sleep(100);}catch(Exceptione){}data=nd+1;}publicintgetData(){returndata;}};classNThreadextendsThread{DataClassd;NThread(DataClassd){this.d=d;}booleanalive=true;publicvoidrun(){for(inti=0;i<10

3、0;i++){d.increase();}alive=false;}};publicclassAccessConflict{publicstaticvoidmain(String[]args){DataClassd=newDataClass();NThreadt1=newNThread(d);NThreadt2=newNThread(d);t1.start();t2.start();while(t1.alive

4、

5、t2.alive);System.out.println("data="+d.getData());}}15.1.2解决冲突防止冲突的方法就是当资源被一个线程访问

6、时,为这个资源加锁。Java使用关键字synchronized来实现这一过程。使用关键字synchronized修饰的方法称为同步方法,当线程调用非静态的synchronized方法时,自动获得synchronized所标示的与正在执行代码类的当前实例(this实例)有关的锁。获得一个对象的锁也称为获取锁、锁定对象、在对象上锁定或在对象上同步。关键字synchronized可以修饰方法一个对象只有一个锁。所以,如果一个线程获得该锁,这时其它线程要想获得该对象的锁就必须等待,直到第一个线程释放(或返回)锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法

7、或代码块,直到该锁被释放。同步时所注意的问题:(1)当程序运行到synchronized同步方法或代码块时才该对象锁才起作用;(2)使用private修饰域,可以防止其它线程直接访问域;(3)线程睡眠时,它所持的任何锁都不会释放;(4)一个线程可以同时获得多个锁;(5)同步方法虽然可以解决同步问题,但也存在缺陷,如果一个同步方法需要执行的时间很长,将会大大影响系统的效率,这时进来使用synchronized块。15.1.3静态方法同步synchronized修饰的静态方法可以在类的范围内防止对static数据的并发访问,如:publicsynchronizedstaticv

8、oidf(){}synchronized修饰的静态方法属于某个类的范围,防止多个线程同时访问这个类中的synchronized修饰的静态方法,它可以对类的所有对象实例起作用。而synchronized的实例方法是某实例的范围,它防止多个线程同时访问这个实例中的synchronized方法。15.2线程间协作可以使用锁(互斥)来同步多个线程,那么如何实现多个线程间的协作呢?多个线程协作的关键在于它们之间的相互通信。互斥可以保证同一时刻只有一个线程相应某个信号,在互斥的基础上再添加某种途径,可以使线程本身挂起,直到某些条件发生变化再转入就绪状态。线程间的通信通过“等待-通知”机

9、制来实现,Object类中的wait()和notify()方法实现了这种机制。wait()方法可以使线程等待某个条件发生变化,而这种条件将由另外一个线程来改变。wait()不是忙等待,线程在wait()期间被挂起,可以通过notify()或notifyAll()被唤醒。有两种形式的wait():(1)publicfinalvoidwait()(2)publicfinalvoidwait(longtimeout,intnanos)这两种重载的wait()都能使线程等待,只不过第一个wait()是通过notify()或

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

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

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