多线程之间通讯

2018-07-24 07:52:42来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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

  第一个线程写入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的操作同一时刻仅有一个线程。。


 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:exe4j将可执行的jar封装成exe文件

下一篇:Spring MVC REST 风格的 URL