对线程的理解

1.判断一段代码并发是否线程安全
(1)先执行的代码先发生于后执行的代码(但这只针对于汇编代码,因为java编译器会进行指令重排序,
不过,被synchrnized与volite修饰的代码块与变量不会被重排序,被volite修饰的变量就像一堵墙
下面的代码无法排上去,上面的代码无法排下去)

(2)一个unlock先于后一个lock操作(对于同一个对象)执行,反应到字节码就是monitorenter与monitorexit

(3)Thread对象的start方法发生先于这个线程的所有代码

(4)对象的构造方法先于它的finallize方法


2.什么操作是原子的
(1)read load use assign store write(Java内存规范定义的几种操作必须是原子的但64位的long与double
不一定)
read:把变量值从主存读到线程的工作内存中()
load:把从主存中读到的变量值写入到工作内存的变量副本中
use:把工作内存中的一个变量值交给执行引擎
assign:用与把从执行引擎获取到的值赋给工作内存的变量,用于赋值操作
store:把工作内存中的变量传给主内存中
write:把从工作内存取到的值写入主内存

(2)final定义的变量是原子的,因为在进行默认初始化的时候就会把显式赋值的值写入内存


3.每个线程都会拷贝一个对象的方法副本,所以访问方法里的局部变量是很安全的
posted @ 2019-04-05 20:50  lollong  阅读(280)  评论(0编辑  收藏  举报