关于synchronized

来源:5-7 同步容器-2

靈寶

2018-06-03

老师好,我看有些源码,synchronized来锁住要操作的对象来保证对象的并发的,而且一般都是这么用的。比如ConcurrentHashMap中put()锁住节点第一个。

我看到另外一些地方synchronized锁住的是一个final new Object()来保证另外一个对象的并发的,比如Tomcat中的servicesLock,在添加、移除、查找、启动服务时都锁住了这个对象,而其服务的集合简单定义。

private Service services[] = new Service[0];

private final Object servicesLock = new Object();

而且通篇servicesLock只在锁定时用了一下,别的地方都没有使用(包括getset)。

这么做有什么好处吗?


写回答

1回答

Jimin

2018-06-03

你好,这样加锁,通常是因为:作用的代码块里的代码如果同时被多个线程执行可能会出现问题。

举个例子,ConcurrentHashMap里put方法带锁,HashMap的put方法不带锁。我们都知道,ConcurrentHashMap可以保证线程安全,而HashMap就无法保证线程安全(课程里有重点讲,不知道你是否学到),极端情况下会出现死锁。ConcurrentHashMap能做到线程安全的本质就是在某些不适合多线程同时执行的代码块加了锁。

而synchronized具体要锁到什么程度,就需要根据实际场景分析了。synchronized锁无非课程里介绍那四种形式,不同的方式的根本就是锁的粒度不一样。在满足条件的情况下,尽可能的将锁的范围小一点,可以加快处理速度。分析synchronized的关键主要就在这里了。

0
6
靈寶
这种写法可带到程序中来,对于某些高并发的增删查等操作,可以使用空对象锁,来确保数据的准确性。
2018-06-03
共6条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程