理解
因为有人的地方就有江湖,所以有并发的地方就有资源共享,有资源共享的地方就有线程安全,有线程安全的地方就有“线程同步”,有线程同步的地方就有“锁”(有点长,但是理是这个理)
虽然在一些因果关系上我的看法不一致,但是不妨碍我觉得⬆️上边的说的很有道理。
并发一定是针对共享资源的
,如果篮球场上的每个人都有一个篮球🏀(资源),那么还需要去抢球竞争么,自然是不必要的。正式因为资源是有限的,才需要竞争。
说 HashMap
是线程不安全的,一定是因为将它作为了资源的容器,而资源在 多线程无锁场景
下,必然不是线程同步的,所以不是线程安全的。如果加锁以后例如 HashTable
则是线程安全,但是又因为加锁粒度太粗 (我认为绝大多数场景下也够用了)而使用的不多。为了降低锁的粒度, ConcurrentHashMap
采取分段锁来减少竞争条件,提升了并发度。
反过来说,如果一个HashMap只能被单线程操作,那么它一定是线程安全的,例如我在方法内部new HashMap,虽然还是作为资源的容器,但是这个容器的入口只有一个线程了。
小结
说明了并发一定是针对共享资源的,然后举例在线程不安全的情况下,转换到线程安全需要加锁。为了提高并发度,必须要减少锁的粒度,降低并发时的竞争条件。