这里也是一个比较好玩的话题:
梳理:当一个线程访问数据,是串行的,也就是第一次改变数据,第二次访问
肯定是拿到改变后的数据。而多线程就没有这么好的命运了。当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未上锁,待论证