线程之间共享

锁:JVM会在每个对象头上都会有个锁的标志位;

一、synchronized内置锁,java自带关键字,也叫内置锁

 

二、volatile

1、可见性是保证每次get时候会从主内存刷新一次值到运行内存中,自己运行内存中的值值为无效;set设置值的时候也会同步到主内存中让其他线程可以看到修改;

 因为age = age + 20, jvm要执行的指令不止一条,所以不是原子操作;只能保证可见性,不能保证原子性;所以并不能真正保证同步;

指令是一条一条的执行;

2、a= a+1 不是原子性操作,不是真正线程安全的;

 

 可见,并不是严格顺序递增,大体上是增加趋势;

所以最适合的场景是:

三、ThredLocal线程变量

1、空间换时间换取线程安全性的方式,从每个线程都从主内存拷贝变量副本,这个线程变量就像一个map,key是每个线程标识,value是线程对应的变量;

变量太大不合适;

TreadLocal原理是一个map:

 2、最适合使用场景是线程池的时候,每个线程保有自己的私有连接,

猜你喜欢

转载自www.cnblogs.com/wmqiang/p/11666984.html