五月 15, 2020

并发编程之Synchronized锁

文章字数 3.1k 阅读约需 3 mins.

synchronized是悲观锁,在操作同步资源之前需要给同步资源先加锁,这把锁就是存在Java对象头里的,Hotspot的对象头主要包括两部分数据:Mark Word(标记字段)、Klass Pointer(类型指针)。

  • Mark Word:默认存储对象的HashCode,分代年龄和锁标志位信息。这些信息都是与对象自身定义无关的数据,所以Mark Word被设计成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据。它会根据对象的状态复用自己的存储空间,也就是说在运行期间Mark Word里存储的数据会随着锁标志位的变化而变化。

  • Klass Point:对象指向它的类元数据的指针,虚...

查看全文

八月 23, 2019

并发编程之锁

文章字数 2.4k 阅读约需 2 mins.

乐观锁

乐观锁认为一个线程去拿数据的时候不会有其他线程对数据进行更改,所以不会上锁。

实现方式:CAS机制、版本号机制

悲观锁

悲观锁认为一个线程去拿数据时一定会有其他线程对数据进行更改。所以一个线程在拿数据的时候都会顺便加锁,这样别的线程此时想拿这个数据就会阻塞。比如Java里面的synchronized关键字的实现就是悲观锁。

实现方式:就是加锁。

排他锁

该锁一次只能被一个线程所持有。比如synchronized、ReentrantLock

共享锁

该锁可以被多个线程所持有,比如ReentrantReadWrit...

查看全文
0%