多线程之间通讯
程序员文章站
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的操作同一时刻仅有一个线程。。