锁:JVM会在每个对象头上都会有个锁的标志位;
一、synchronized内置锁,java自带关键字,也叫内置锁
二、volatile
1、可见性是保证每次get时候会从主内存刷新一次值到运行内存中,自己运行内存中的值值为无效;set设置值的时候也会同步到主内存中让其他线程可以看到修改;
因为age = age + 20, jvm要执行的指令不止一条,所以不是原子操作;只能保证可见性,不能保证原子性;所以并不能真正保证同步;
指令是一条一条的执行;
2、a= a+1 不是原子性操作,不是真正线程安全的;
可见,并不是严格顺序递增,大体上是增加趋势;
所以最适合的场景是:
三、ThredLocal线程变量
1、空间换时间换取线程安全性的方式,从每个线程都从主内存拷贝变量副本,这个线程变量就像一个map,key是每个线程标识,value是线程对应的变量;
变量太大不合适;
TreadLocal原理是一个map:
2、最适合使用场景是线程池的时候,每个线程保有自己的私有连接,