欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

多线程之间通讯

程序员文章站 2022-07-05 11:13:19
多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。 第一个线程写入count,另一个线程取读取count的值.实现读一个,写一个操作。 小明,男 小明,女 小红,女 小明,男数据格式发生错误?????System.out.println(res.username+","+res. ......

多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。

  第一个线程写入count,另一个线程取读取count的值.实现读一个,写一个操作。

  多线程之间通讯

 

class Res{
    public String username;
    public String sex;
}
class Out extends Thread{
    Res res;

    public Out(Res res){
        this.res=res;
    }
    @Override
    public void run() {
        //写操作
        int count=0;
        while (true){
//            synchronized (res.getClass()){
                if(count==0){//偶数
                    res.username="小明";
                    res.sex="男";
                } else {//奇数
                    res.username="小红";
                    res.sex="女";
                }
                count=(count+1)%2;
//            }
            }

    }
}
class Input extends Thread{
    Res res;
    public Input(Res res){
        this.res=res;
    }

    @Override
    public void run() {
        while (true){
//            synchronized (res.getClass()){
                System.out.println(res.username+","+res.sex);
//            }
        }
    }
}
public class OutInputThread {
    public static void main(String[] args) {
        Res res = new Res();
        Out out = new Out(res);
        Input input = new Input(res);
        out.start();
        input.start();
    }
}

 

输出如下:

  小明,男
  小明,女
  小红,女
  小明,男
数据格式发生错误?????System.out.println(res.username+","+res.sex);Input这一句在输出username时,可能Out又修改了Res对象的值为小红/小明,导致sex发生混乱,,也就是说多线程下,读写同一个资源也可能发生线程安全问题,可见性不具备原子性。

具体原因请参考Java内存模型。。。https://blog.csdn.net/qq_37049496/article/details/81172330

怎么解决?同步而且是两个线程都需要同步,取消注释即可保证对共享资源res的操作同一时刻仅有一个线程。。