网易Java研发面试官眼中的Java并发——安全性、活跃性、性能
2020-12-13 05:26
标签:hashmap 乐观锁 syn 性问题 增加 理论 变化 没有 hash 线程安全的本质是正确性,而正确性的含义是程序按照预期执行 理论上线程安全的程序,应该要避免出现可见性问题(CPU缓存)、原子性问题(线程切换)和有序性问题(编译优化) 需要分析是否存在线程安全问题的场景:存在共享数据且数据会发生变化,即有多个线程会同时读写同一个数据 针对该理论的解决方案:不共享数据,采用线程本地存储(Thread Local Storage,TLS);不变模式 数据竞争(Data Race):多个线程同时访问同一数据,并且至少有一个线程会写这个数据 面对数据竞争和竟态条件问题,可以通过互斥的方案来实现线程安全,互斥的方案可以统一归为锁 活跃性问题:某个操作无法执行下去,包括三种情况:死锁、活锁、饥饿 网易Java研发面试官眼中的Java并发——安全性、活跃性、性能 标签:hashmap 乐观锁 syn 性问题 增加 理论 变化 没有 hash 原文地址:https://www.cnblogs.com/Java-no-1/p/11141000.html一. 安全性问题
Ⅰ. 数据竞争
1. add
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;
}
}
2. add + synchronized
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);
}
}
Ⅱ. 竟态条件
1. 转账
public class Account {
private int balance;
// 非线程安全,存在竟态条件,可能会超额转出
public void transfer(Account target, int amt) {
if (balance > amt) {
balance -= amt;
target.balance += amt;
}
}
}
Ⅲ. 解决方案
二. 活跃性问题
Ⅰ. 死锁
Ⅱ. 活锁
Ⅲ. 饥饿
三. 性能问题
S=1/((1-p)+p/n),n为CPU核数,p为并行百分比,(1-p)为串行百分比
Ⅰ. 解决方案
Ⅱ. 性能指标
写在最后
上一篇:webdriver 键盘模拟事件
下一篇:Windows远程桌面使用大招儿
文章标题:网易Java研发面试官眼中的Java并发——安全性、活跃性、性能
文章链接:http://soscw.com/essay/31030.html