1.原子性
原子性:在一个操作中,不能被其他操作中断,类似数据库事务的原子性,一个操作就是一个原子操作,保证了线程的安全和数据的可靠。
java内存模型定义了8个操作来完成主内存和工作内存的交互操作,需要注意的是,没有被volatile修饰的64位数据,会被分成2次32位操作,操作一半时可能被其他线程读取,造成结果错误。
下面是1000个线程同时对num执行自增操作的结果
1.1互斥锁
解决线程访问冲突过程,同步锁永远是最直接的方法,但阻塞比较消耗性能,非必要不推荐。
1.2原子类(Atomic)
使用AtomicInteger类型可以保证多线程下执行的原子性。
2.可见性
当一个线程修改了共享变量的值,其他线程能立即得知这个修改。
2.1
java内存模型是通过在变量修改后将新值同步回主内存,在变量读取前从主内存刷新变量值来实现可见性的。
2.2实现方式
(1)volatile
(2)synchronized
(3)final,前提:不发生this逃逸
上述代码中只需要将num2类型添加volatile即可实现可见性