java中线程同步方法

java中线程同步方法

ID:20395368

大小:32.50 KB

页数:3页

时间:2018-10-09

java中线程同步方法_第1页
java中线程同步方法_第2页
java中线程同步方法_第3页
资源描述:

《java中线程同步方法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Java中线程同步的方法  本文由广州疯狂软件java培训为你整理:  用什么关键字修饰同步方法?用synchronized关键字修饰同步方法  同步有几种实现方法,都是什么?分别是synchronized,wait与notify  wait():使一个线程处于等待状态,并且释放所持有的对象的lock。  sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。  notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,

2、而且不是按优先级。  Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。  实现同步的方式  同步是多线程中的重要概念。同步的使用可以保证在多线程运行的环境中,程序不会产生设计之外的错误结果。同步的实现方式有两种,同步方法和同步块,这两种方式都要用到synchronized关键字。  给一个方法增加synchronized修饰符之后就可以使它成为同步方法,这个方法可以是静态方法和非静态方法,但是不能是抽象类的抽象方法,也不能是接口中的接口方法。下面代码是一个同步方法的示例:  publicsynchronizedvoid

3、aMethod(){  //dosomething  }  publicstaticsynchronizedvoidanotherMethod(){  //dosomething  }  线程在执行同步方法时是具有排它性的。当任意一个线程进入到一个对象的任意一个同步方法时,这个对象的所有同步方法都被锁定了,在此期间,其他任何线程都不能访问这个对象的任意一个同步方法,直到这个线程执行完它所调用的同步方法并从中退出,从而导致它释放了该对象的同步锁之后。在一个对象被某个线程锁定之后,其他线程是可以访问这个对象的所有非同步方法的。  同步块是通过锁定一个指定的对象,来对同步块中包含的

4、代码进行同步;而同步方法是对这个方法块里的代码进行同步,而这种情况下锁定的对象就是同步方法所属的主体对象自身。如果这个方法是静态同步方法呢?那么线程锁定的就不是这个类的对象了,也不是这个类自身,而是这个类对应的java.lang.Class类型的对象。同步方法和同步块之间的相互制约只限于同一个对象之间,所以静态同步方法只受它所属类的其它静态同步方法的制约,而跟这个类的实例(对象)没有关系。  如果一个对象既有同步方法,又有同步块,那么当其中任意一个同步方法或者同步块被某个线程执行时,这个对象就被锁定了,其他线程无法在此时访问这个对象的同步方法,也不能执行同步块。  synch

5、ronized关键字用于保护共享数据。请大家注意“共享数据”,你一定要分清哪些数据是共享数据,请看下面的例子:  publicclassThreadTestimplementsRunnable{  publicsynchronizedvoidrun(){  for(inti=0;i<10;i++){  System.out.print(""+i);  }  }  publicstaticvoidmain(String[]args){  Runnabler1=newThreadTest();//也可写成ThreadTestr1=newThreadTest();  Runnabl

6、er2=newThreadTest();  Threadt1=newThread(r1);  Threadt2=newThread(r2);  t1.start();  t2.start();  }}  在这个程序中,run()虽然被加上了synchronized关键字,但保护的不是共享数据。因为这个程序中的t1,t2是两个对象(r1,r2)的线程。而不同的对象的数据是不同的,r1,r2有各自的run()方法,所以输出结果无法预知。  synchronized的目的是使同一个对象的多个线程,在某个时刻只有其中的一个线程可以访问这个对象的synchronized数据。每个对象都

7、有一个“锁标志”,当这个对象的一个线程访问这个对象的某个synchronized数据时,这个对象的所有被synchronized修饰的数据将被上锁(因为“锁标志”被当前线程拿走了),只有当前线程访问完它要访问的synchronized数据时,当前线程才会释放“锁标志”,这样同一个对象的其它线程才有机会访问synchronized数据。  示例3:  publicclassThreadTestimplementsRunnable{  publicsynchronizedvoidrun(){  for(in

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

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

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