标签:hashmap 乐观锁 syn 性问题 增加 理论 变化 没有 hash
线程安全的本质是正确性,而正确性的含义是程序按照预期执行
理论上线程安全的程序,应该要避免出现可见性问题(CPU缓存)、原子性问题(线程切换)和有序性问题(编译优化)
需要分析是否存在线程安全问题的场景:存在共享数据且数据会发生变化,即有多个线程会同时读写同一个数据
针对该理论的解决方案:不共享数据,采用线程本地存储(Thread Local Storage,TLS);不变模式
数据竞争(Data Race):多个线程同时访问同一数据,并且至少有一个线程会写这个数据
private static final int MAX_COUNT = 1_000_000; private long count = 0; // 非线程安全 public void add() { int index = 0; while (++index < MAX_COUNT) { count += 1; } }
private static final int MAX_COUNT = 1_000_000; private long count = 0; public synchronized long getCount() { return count; } public synchronized void setCount(long count) { this.count = count; } // 非线程安全 public void add() { int index = 0; while (++index < MAX_COUNT) { setCount(getCount() + 1); } }
public class Account { private int balance; // 非线程安全,存在竟态条件,可能会超额转出 public void transfer(Account target, int amt) { if (balance > amt) { balance -= amt; target.balance += amt; } } }
面对数据竞争和竟态条件问题,可以通过互斥的方案来实现线程安全,互斥的方案可以统一归为锁
活跃性问题:某个操作无法执行下去,包括三种情况:死锁、活锁、饥饿
网易Java研发面试官眼中的Java并发——安全性、活跃性、性能
标签:hashmap 乐观锁 syn 性问题 增加 理论 变化 没有 hash
原文地址:https://www.cnblogs.com/Java-no-1/p/11141000.html