1、定义:可以作为一个不可分割的操作来执行。例如,count++就不具备原子性,它包含了读取、修改和写入3个独立的操作。
2、会导致不正确结果的情况
(1)竞态条件
当有多个线程时,正确的事件发生时序导致正确的结果,否则导致错误的结果。最常见的条件类型就是“先检查后执行”操作,即通过一个可能失效的观测结果来决定下一步的动作。
“先检查后执行”的一种常见情况就是延迟初始化。延迟初始化的目的是将对象的初始化操作推迟到实际被使用时才进行,同时要确保只被初始化一次。
(2)复合操作
复合操作:将“先检查后执行”以及“读取-修改-写入”等操作统称为复合操作。
当某个线程修改变量时,要防止其他线程使用这个变量,从而确保其他线程只能在修改操作完成之前或之后读取和修改状态,而不是在修改状态的过程中。
3、以上问题解决方法
(1)使用一个现有的线程安全类。
(2)加锁机制
java的内置锁相当于一种互斥体(互斥锁),是对同步代码块上锁,这意味着最多只有一个线程能持有这种锁,线程进入同步代码块之前获得锁,退出同步代码块时自动释放锁。
(3)允许线程重入