网易Java研发面试官眼中的Java并发——安全性、活跃性、性能
2020-12-13 05:26
标签:ret 加速比 场景 线程 需要 读写 循环 队列 分段 线程安全的本质是正确性,而正确性的含义是程序按照预期执行 理论上线程安全的程序,应该要避免出现可见性问题(CPU缓存)、原子性问题(线程切换)和有序性问题(编译优化) 需要分析是否存在线程安全问题的场景:存在共享数据且数据会发生变化,即有多个线程会同时读写同一个数据 数据竞争(Data Race):多个线程同时访问同一数据,并且至少有一个线程会写这个数据 面对数据竞争和竟态条件问题,可以通过互斥的方案来实现线程安全,互斥的方案可以统一归为锁 活跃性问题:某个操作无法执行下去,包括三种情况:死锁、活锁、饥饿 网易Java研发面试官眼中的Java并发——安全性、活跃性、性能 标签:ret 加速比 场景 线程 需要 读写 循环 队列 分段 原文地址:https://blog.51cto.com/14409778/2417610一. 安全性问题
Ⅰ. 数据竞争
1. add
private static final int MAX_COUNT = 1_000_000;
private long count = 0;
// 非线程安全
public void add() {
int index = 0;
while (++index
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
Ⅱ. 竟态条件
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)为串行百分比
Ⅰ. 解决方案
Ⅱ. 性能指标
写在最后
上一篇:使用PHP对象实现分页效果!
下一篇:windows下面的远程登录
文章标题:网易Java研发面试官眼中的Java并发——安全性、活跃性、性能
文章链接:http://soscw.com/essay/31038.html