解决上面的线程间通信时再次加深线程加锁的两个必须注意的条件:
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这一类的字节码文件,也是唯一的,最先被加载到内存中,且只有一份。