1、原子性问题
除了JVM自身提供的对基本数据类型读写操作的原子性外,可以通过 synchronized
和Lock
实现原子性。因为synchronized
和Lock
能够保证任一时刻只有一个线程访问该代码块。
2、可见性问题
volatile
关键字保证可见性。当一个共享变量被volatile修饰时,它会保证修改的值立即被其他的线程看到,即修改的值立即更新到主存中,当其他线程需要读取时,它会去内存中读取新值。
synchronized
和Lock
也可以保证可见性,因为它们可以保证任一时刻只有一个线程能访问共享资源,并在其释放锁之前将修改的变量刷新到内存中。
3、有序性问题
通过·volatile·可以保证有序性
可以通过synchronized
·和·Lock·
来保证有序性,很显然,synchronized和Lock保证每个时刻是有一个线程执行同步代码,相当于是让线程顺序执行同步代码,自然就保证了有序性。
史上最全的并发编程脑图:https://www.processon.com/view/5b1f1ad7e4b03f9d251c06e5#map