请解释Java中线程安全的概念,并说明其核心特征及常见实现方式。
考察说明
考查对Java并发中线程安全概念的准确理解,以及能否结合JMM和常见同步机制说明实现方式。
回答思路
- 【回答框架 1】线程安全是指当多个线程同时访问某个对象或方法时,无论调度顺序如何,程序都能保持正确性,即结果符合预期且无需额外同步。核心特征包括原子性、可见性和有序性,这些由Java内存模型(JMM)保证。
- 【回答框架 2】实现线程安全的常见方式:原子类(如AtomicInteger)利用CAS实现原子操作;同步块或锁(synchronized、ReentrantLock)保证互斥和可见性;volatile保证可见性和有序性,但不保证原子性。
- 【回答框架 3】在无同步的情况下,共享可变数据可能导致竞态条件、脏读或死锁等问题。例如i++不是原子操作,需要同步或原子类。线程安全的类如Vector、HashTable使用同步方法,但性能较低,常用ConcurrentHashMap等并发容器替代。
- 【回答框架 4】评估线程安全需考虑对象的共享范围、可变性和操作组合,不可变对象天然线程安全,局部变量也不会共享。具体设计时结合业务场景,权衡性能与一致性。
- 【关键点 1】线程安全要求多线程访问共享数据时结果正确,核心是原子性、可见性和有序性。
- 【关键点 2】实现方式包括synchronized、Lock、volatile、原子类及不可变对象。
- 【关键点 3】JMM通过happens-before规则和内存屏障保证跨线程的可见性与有序性。
- 【关键点 4】线程安全并非绝对,需结合具体场景,如复合操作可能仍需要额外同步。
- 【易错点 1】volatile不保证原子性,不能用于实现i++等复合操作。
- 【易错点 2】仅使用同步方法不一定保证线程安全,复合操作需整体同步。
- 【易错点 3】过度使用同步可能导致性能下降或死锁,需权衡。