1.三个问题:原子性问题,可见性问题,有序性问题
原子性:要么全部执行,要么全部不执行
可见性:当多线程访问同一个变量时,一个线程改变了这个变量的值,其他线程能够立即看得到修改的值
//线程1执行的代码
inti =0;
i =10;
//线程2执行的代码
j = i;
线程2执行 j = i,它会先去主存读取i的值并加载到CPU2的缓存当中,注意此时内存当中i的值还是0,那么就会使得j的值为0,而不是10.
2.happens-before原则(先行发生原则):
——程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作
——锁定规则:一个unLock操作先行发生于后面对同一个锁额lock操作
——volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作
——传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C
——线程启动规则:Thread对象的start()方法先行发生于此线程的每个一个动作
——线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生
——线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行
——对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始
3.volatile:(无法保证操作的原子性)一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:
1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
2)禁止进行指令重排序。