Java 并发安全

2020-05-20  本文已影响0人  攻城狮托马斯

无状态类


return type是void,不加任何成员变量的类

不可变类


1.加final 关键字的variable(不可更改) 2.不提供成员变量的修改方法

安全的发布, collections包裹


private List<Integer> list = Collections.synchronizedList(new ArrayList<>())

Servlet 解析


并不是线程安全的类,但是很少有共享servlet的需求,并且返回应答的时候通常由一个线程来负责。

死锁发生的条件


1.互斥条件: 资源排他

2.请求和保持条件: 线程至少保存一个资源,但又提出了新的资源请求

3.不剥夺条件: 线程未完成资源之前,不能被剥夺,只能使用完自己释放

4.环形等待: A 等 B, B 等 A

活锁


由于分配原因,锁总是给一个线程拿到,可以通过随机分配锁给线程来解

如何解决死锁


一般都是默认死锁不会发生,然后写程序单独解决死锁。

下文链接是死锁解决方案:

https://blog.csdn.net/xiaofeng66666/article/details/80494711

Operating system中还有死锁的解锁算法,但面试肯定不会问到也用不到.

线程饥饿


低优先级的线程总是拿不到执行时间.

如何减少锁的竞争


1.减少锁的粒度, 如果一个对象是独立变化的时候,应该用单独的锁一一锁住这些对象

2.缩小锁的范围, 如果锁住的是代码块的话, 那么减少锁的范围

3.避免独占锁,避免多余的锁

4.替换独占锁,用读写锁或者CAS

上一篇 下一篇

猜你喜欢

热点阅读