毕向东讲解(摘)—12.线程通信,解决安全问题

解决上面的线程间通信时再次加深线程加锁的两个必须注意的条件:
      1.如果两个线程操作的是同一个资源就要加锁

      2.两个线程的锁,必须保证是同一个锁

package day7;

/**

 * 多线程,线程间通信示例代码

 *

 * Test中线程间通信出现的问题进行解决

 * 加锁

 * 1.保证操作同一个资源的代码全部加锁

 * 2.保证加的锁是统一个锁

 * @authormzy

 *

 */

publicclassTest1{

    publicstaticvoidmain(String[]args){

       Res1r=newRes1();

       Input1i=newInput1(r);

       Output1o=newOutput1(r);

      

       Threadt1=newThread(i);

       Threadt2=newThread(o);

       t1.start();

       t2.start();

    }

}

 

classRes1{

    Stringname;

    Stringsex;

}

 

classInput1implements Runnable{

    Res1r;

    Input1(Res1r){

       this.r=r;

    }

    publicvoidrun(){

       intx=0;

       while(true){

           if(x==0){

              synchronized(r){ //使用四个类的.class文件也可以

                  r.name="王二";

                  r.sex="";

              }

           }else{

              synchronized(r){ //使用四个类的.class文件也可以

                  r.name="rose";

                  r.sex="woman";

              }

           }

           x=(x+1)%2;

       }

    }

}

 

class Output1implements Runnable{

    Res1r;

    Output1(Res1r){

       this.r=r;

    }

    publicvoidrun(){

       while(true){

           synchronized(r){ //使用四个类的.class文件也可以

               System.out.println(r.name+"..."+r.sex);

           }

       }

    }

}

以上的锁可以用唯一的r对象,也可以使用Test1.class、Res.class、Input.class、Output.class这一类的字节码文件,也是唯一的,最先被加载到内存中,且只有一份。

原文地址:https://www.cnblogs.com/mzywucai/p/11053514.html