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。
相关文章推荐
- [ERROR] [2012-59-30 05:59:28] org.hibernate.AssertionFailure.<init>(AssertionFailure.java:45) -an a
- 【线程】Java线程(3)-线程安全解决方案(加锁机制)Atomic && synchronized
- JAVA基础--类加载&对象创建过程
- Exception in thread "TimerTotal_3" java.lang.OutOfMemoryError: Java heap space
- 解决"java.lang.UnsatisfiedLinkError: Native Library xxx.dll already loaded in another classloader"问题
- java中的多态和继承---"编译看左边,运行看右边"(多态执行)
- 如何成为JAVA高手&nbsp;[转]
- 原码,反码,补码详解及 Java中>>和>>>的区别
- JAVA实现广度搜索&深度搜素
- Java: IE & Firefox下载文件中文乱码的兼容代码
- Java 嵌套类和内部类演示样例<二>
- [Sqlite]-->使用Java程序、cmd命令行来备份恢复Sqlite数据库
- Java中的守护线程 & 非守护线程(简介)
- Java 集合 持有引用 & WeakHashMap
- Java中的位运算符与逻辑运算符的区别(&和&&,|和||)
- java中关于&0xFF 的问题
- Java知识(多线程模式和线程安全)
- Java 对国际化 (i18n) 的支持&资源包的调用
- java去掉html标签 必须首先去掉 "
- Java高并发-Java内存模型和线程安全