您的位置:首页 > Web前端

java 线程安全 safety failure & liveness failure

2010-11-15 17:01 253 查看
import java.util.concurrent.TimeUnit;
public class SafeFail {
private volatile static int nextNum = 0;
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 10; i++) {
Thread t = new Thread(new Runnable() {
public void run() {
while (nextNum < 2000) {
int t = getNext();
System.out.println(t);
}
}
}, "name_" + i);
t.start();
TimeUnit.NANOSECONDS.sleep(1);
}
}
public static int getNext() {
return nextNum++;
}
}


1. ++ 不是原子操作,执行两项操作。首先取值,然后写一个新值。如果第二个线程在取旧值与写新的值是读取,那么第二个线程就会返回相同的值。这是安全性失败,safety failure.

public class StopThread {

private static boolean stop;

main {

Thread t = new Thread ( new Runnable () {

run () {

int i=0;

while (!stop)

i++;

}

}) ;

t.start();

Thread.sleep(1);

stop = true;

}

}

你可能会期望t线程在一秒后停掉,然而,可能并不会如愿,因为主线程对stop所做的修改,并不能保证对t是可见的。没有同步,代码会被编译为

if (!stop)

while (true)

i ++;

果是t线程不会停止。这个被称做活性失败。liveness failure。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: