多线程数据改变导致可见性问题整理

来源:互联网 发布:网络伤感情歌 编辑:程序博客网 时间:2024/05/17 22:50

这里也是一个比较好玩的话题:

梳理:当一个线程访问数据,是串行的,也就是第一次改变数据,第二次访问

肯定是拿到改变后的数据。而多线程就没有这么好的命运了。当A

改变数据,B去拿的时候可能数据源根本没有变化,错误以为没有改变。


JAVA并发编程实战举了一个例子。

当A尝试改变一个数据,同时改变状态为已经改变的状态。

B检查状态改变做相应的处理。当简单的多线程甚至是加锁处理发现效果并不满意:

原因很简单:加锁防止别的线程访问,但是自己改变了数据并不能及时的通知对方。

public class Down extends Thread{    static boolean isChanged;    static int count;  static   DownloadEntity downloadEntity=new DownloadEntity();    public static void main(String args[])    {       new ReadThread().start();        isChanged=true;        count=111;    }    static class ReadThread extends Thread    {        public void run()        {          while(!isChanged)              Thread.yield();            System.out.print(count);        }    }    public void run()    {        downloadEntity.get(System.currentTimeMillis());    }    public static void print()    {        System.out.print(downloadEntity.get(System.currentTimeMillis()));    }}

很遗憾,这段代码执行完了

那么是什么导致》?待:

主要是set/get未上锁,待论证




0 0
原创粉丝点击