第一部分:并发理论基础12->面向对象思想写好并发程序
面向对象思想写并发程序
1. 封装共享变量
面向对象封装,
属性和实现细节封装在对象内部,外部通过公共方法简介访问内部属性
将共享变量作为对象属性封装在内部,对外公共方法制定并发访问策略
以计数器为例,共享变量value,将公共方法get和addOne声明为同步方法,这样就对共享变量的操作就变成了线程安全了
public class Counter {
private long value;
synchronized long get(){
return value;
}
synchronized long addOne(){
return ++value;
}
}
对于不会发生变化的共享变量,建议使用final修饰,性能还好。同时还能解决并发问题
2.识别共享变量间的约束条件
识别共享变量的约束条件很重要,约束条件,决定了并发访问策略
public class SafeWM {
// 库存上限
private final AtomicLong upper =
new AtomicLong(0);
// 库存下限
private final AtomicLong lower =
new AtomicLong(0);
// 设置库存上限
void setUpper(long v){
upper.set(v);
}
// 设置库存下限
void setLower(long v){
lower.set(v);
}
// 省略其他业务代码
}
库存下限要小于库存上限
3.指定并发访问策略
- 避免共享,避免共享的技术主要利用线程本地存储以及为每个任务分配独立的线程
- 不变模式:java里用的少,actor模式,csp模式
- 管程和其他同步工具,java领域万能解决方案是管程,但很多特定场景,java并发包里的读写锁,并发容器等同步工具更好
4.注意事项
- 优先使用成熟的工具类,java sdk并发包里提供了丰富的工具类,熟悉并掌握它们,而不是自己造轮子
2.迫不得已才使用低级的同步原语,synchronized,Lock,Semaphore等;这些虽然简单,实际上一定要小心使用
3.避免过早优化,安全第一,并发程序首先保证安全,出现性能瓶颈后再优化
5.总结
原创:做时间的朋友