`
zengshaotao
  • 浏览: 754518 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

只在synchronized块里同步

 
阅读更多

package thread;

/**
 * 线程在执行同步方法时是具有排它性的。当任意一个线程进入到一个对象的任意一个同步方法时,
 * 这个对象的所有同步方法都被锁定了,在此期间,其他任何线程都不能访问这个对象的任意一个同步方法,
 * 直到这个线程执行完它所调用的同步方法,从中退出并释放该对象的同步锁之后。
 * 在一个对象被某个线程锁定之后,其他线程是可以访问这个对象的所有非同步方法的。
同步块是通过锁定一个指定的对象,来对同步块中包含的代码进行同步;
而同步方法是对这个方法块里的代码进行同步,这种情况下锁定的对象就是同步方法所属的主体对象自身。
如果一个对象既有同步方法,又有同步块,那么当其中任意一个同步方法或者同步块被某个线程执行时,
这个对象就被锁定了,其他线程无法在此时访问这个对象的同步方法,也不能执行同步块

如果这个方法是静态同步方法呢?
那么线程锁定的就不是这个类的对象了,也不是这个类自身,而是这个类对应的java.lang.Class类型的对象。
同步方法和同步块之间的相互制约只限于同一个对象之间,
所以静态同步方法只受它所属类的其它静态同步方法的制约,而跟这个类的实例(对象)没有关系。
 * @author zengst
 *
 */
public class NonSynchrTest {

 public static void main(String args[]) {
  //这里new了不同的对象,不存在线程冲突的问题
  

//注意,这里不是new多个对象,否则没有同步的意义(因为对象锁是对同一个对象而言的)
  NonSynChrThread nc1 = new NonSynChrThread("mb1");
  Thread t1 = new Thread(nc1);
  t1.start();
  try {
   Thread.sleep(1000);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  Thread t2 = new Thread(nc1);
  t2.start();
  try {
   Thread.sleep(1000);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  Thread t3 = new Thread(nc1);
  t3.start();
  
  
  
 }
}

class NonSynChrThread implements Runnable{
 
 public NonSynChrThread(String name){
 }
 public void run() {
  System.out.println(Thread.currentThread().getName()+":thread start ! ");
  print(10);
 }
 public synchronized void print(int n){
  try {
   for(int i=0;i< n ;i++){
    System.out.println(Thread.currentThread().getName()+":print:"+i);
    Thread.sleep(500);
   }
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  
  
 }
}

运行结果:

Thread-0:thread start !
Thread-0:print:0
Thread-0:print:1
Thread-0:print:2
Thread-1:thread start !  --这里说明在线程0执行同步块时依然有其他线程在非同步块外执行
Thread-0:print:3
Thread-0:print:4
Thread-2:thread start !
Thread-0:print:5
Thread-0:print:6
Thread-0:print:7
Thread-0:print:8
Thread-0:print:9
Thread-2:print:0
Thread-2:print:1
Thread-2:print:2
Thread-2:print:3
Thread-2:print:4
Thread-2:print:5
Thread-2:print:6
Thread-2:print:7
Thread-2:print:8
Thread-2:print:9
Thread-1:print:0
Thread-1:print:1
Thread-1:print:2
Thread-1:print:3
Thread-1:print:4
Thread-1:print:5
Thread-1:print:6
Thread-1:print:7
Thread-1:print:8
Thread-1:print:9

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics