原子性:
原子性是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就 不会被其它线程干扰。 i++ 不是原子操作
有序性
一条指令的执行是可以分为很多步骤的
– 取指IF
– 译码和取寄存器操作数 ID
– 执行或者有效地址计算 EX
– 存储器访问 MEM
– 写回WB
可见性
可见性是指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改。
– 编译器优化
– 硬件优化(如写吸收,批操作)
Happen-Before规则
1、程序顺序原则:一个线程内保证语义的串行性
2、volatile规则:volatile变量的写,先发生于读,这保证了volatile变量的可见性
3、锁规则:解锁(unlock)必然发生在随后的加锁(lock)前
4、传递性:A先于B,B先于C,那么A必然先于C
5、线程的start()方法先于它的每一个动作
6、线程的所有操作先于线程的终结(Thread.join())
7、线程的中断(interrupt())先于被中断线程的代码
8、对象的构造函数执行结束先于finalize()方法
线程安全的概念
指某个函数、函数库在多线程环境中被调用时,能够正确地处理各个线程的局部变量,使程序功 能正确完成
public class AccountingSync implements Runnable {
static AccountingSync instance = new AccountingSync();
static int i = 0;
@Override
public void run() {
for (int j = 0; j < 10000000; j++) {
synchronized (instance) {
i++;
}
}
}
}