java实现线程同步

Yangsz707 贡献于2013-02-23

作者 微软用户  创建于2010-10-04 18:16:00   修改者微软用户  修改于2010-10-04 18:16:00字数3011

文档摘要:任意一个对象都有一个标志位,有1和0两种状态   *当程序执行到synchronized代码块的时候线程会检查对象的标志位是1还是0   *如果是1则执行程序,同是将对象的标志位设置为0,其他线程执行到synchronized代码块时一看对象标志位为0 .
关键词:

 大家注意了!请仔细参考下面的例子: package synh; /*class ThreadDemo implements Runnable{ int tickets = 100;//票数 String str = new String(""); public void run(){   while(true){    /*     *分析synchronized方法     *synchronized代码块中的语句只能有一个线程在执行     *     *任意一个对象都有一个标志位,有1和0两种状态     *当程序执行到synchronized代码块的时候线程会检查对象的标志位是1还是0     *如果是1则执行程序,同是将对象的标志位设置为0,其他线程执行到synchronized代码块时一看对象标志位为0     *则线程会阻塞,一直等到对象的标志位为1再执行下面的程序     *本程序中一共产生了4个线程,当一个线程执行synchronized代码块的时候其他三个线程会发生阻塞     *第一个线程执行完synchronized代码块后会把对象的标志位设置为1,其他的三个线程中的其中一个     *会抢到synchronized代码块的执行权,同时会把对象的标志位设置为0,就以这样的顺序循环执行     *     *我们也可以把对象标志位看成一个监视器,当一个线程执行到synchronized代码块的时候会检查监视器的     *状态,一个刚执行完synchronized代码块的线程也可以再次检查监视器并执行synchronized代码块     *     *多个线程要实现同步,必须使用相同的监视器对象(本例中4个线程都是用的str同一个对象),     *如果多个线程使用的不是同一个监视器对象则达不到同步的效果    *    synchronized(str){     if(tickets > 0){      try{Thread.sleep(1);}catch(Exception e){}      System.out.println(Thread.currentThread().getName() + " is salling ticket --- " + tickets--);     }    }   } } }*/ class ThreadDemo implements Runnable{ int tickets = 100;//票数 String str = new String(""); //在一个方法里实现同步 public void run(){   while(true){    sale();   } } /*   *同步方法和同步块道理一样,这里就不再说了   *当一个线程执行同步方法的时候其他的方法也不能再执行同步方法中的语句   */ public synchronized void sale(){   if(tickets > 0){      try{Thread.sleep(1);}catch(Exception e){}//模拟不同步的实现      System.out.println(Thread.currentThread().getName() + " is salling ticket --- " + tickets--);     } } } class ThreadTest{ public static void main(String [] args){   ThreadDemo td = new ThreadDemo();   /*    *生成4个线程    *    */   new Thread(td).start();   new Thread(td).start();   new Thread(td).start();   new Thread(td).start(); } } 看完了线程间的同步,再看看同步方法和同步代码块之间的同步 package synch; class ThreadDemo implements Runnable{ int tickets = 100;//票数 String str = new String(""); //在一个方法里实现同步 public void run(){   if(str.equals("method")){    while(true){     sale();    }   }   else{    while(true){     synchronized(this){      if(tickets > 0){       try{Thread.sleep(1);}catch(Exception e){}       System.out.println(Thread.currentThread().getName() + " is salling ticket --- " + tickets--);      }     }    }   } } /*   *同步方法和同步块道理一样,这里就不再说了   *当一个线程执行同步方法的时候其他的方法也不能再执行同步方法中的语句   */ public synchronized void sale(){   if(tickets > 0){      try{Thread.sleep(1);}catch(Exception e){}//模拟不同步的实现      System.out.println("method: " + Thread.currentThread().getName() + " is salling ticket --- " + tickets--);     } } } class ThreadTest1{ public static void main(String [] args){   ThreadDemo td = new ThreadDemo();   /*    *生成4个线程    *    */   new Thread(td).start();   //这里写这个sleep()是为了让CPU转到当前线程来执行   try{Thread.sleep(1);}catch(Exception e){}  td.str = "method";   new Thread(td).start();   //new Thread(td).start();   //new Thread(td).start(); } } 这里最关键的一点就是要想让同步方法和同步代码块同步,两者就要使用相同的监视器对象 本程序中用的同一个监视器对象是this package sang1; public class TextDeadLock implements Runnable{ public int flag = 1; static Object o1 = new Object(),o2 = new Object(); public void run(){ System.out.println("flag="+flag); if(flag==1){ synchronized(o1){ try{ Thread.sleep(100); }catch(Exception e){ e.printStackTrace(); } synchronized(o2){ System.out.println("1"); } } } if(flag==0){ synchronized(o2){ try{ Thread.sleep(200); }catch(Exception e){ e.printStackTrace(); } synchronized(o1){ System.out.println("0"); } } } } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub TextDeadLock td1 = new TextDeadLock(); TextDeadLock td2 = new TextDeadLock(); td1.flag = 1; td2.flag = 0; Thread t1 = new Thread(td1); Thread t2 = new Thread(td2); t1.start(); t2.start(); } }

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 3 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档