java锁

时间:2020-09-16 18:17:49   收藏:0   阅读:82

1.1乐观锁 VS 悲观锁

乐观锁与悲观锁是一种广义上的概念,主要区别在对于同步资源的处理方式的不同。在Java和数据库中都有此概念对应的实际应用。

1.2 自旋锁 VS 适应性自旋锁

其实就是为了避免频繁切换线程引入的锁。也属于中的广义的锁概念。我们都知道锁的实现机制,如果当前线程未持有锁,就需要等待其他线程执行完成释放锁后获得锁,然后执行。 这个时候就需要将该线程挂起和唤醒,如果本来同步代码块的代码就很简单,状态转换消耗的时间有可能比用户代码执行的时间还要长。那么我们就需要重新考虑是否有比较让线程"等一会儿"。所以就产生了自旋锁。当然也不可能无限制的等下去。毕竟线程在这里等也需要占用处理器时间。所以就需要设置等待时间(次数)。一般的自旋锁是设定成恒定值,但是这样也不够"智能"。由此产生了适应性自旋锁。让锁自己判断等待多久。
技术分享图片

1.3 无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁

这个应该属于java中最重要的锁概念了。而且这四种锁主要是针对synchronized的。
首先我们需要了解对象的结构:
技术分享图片
其中对象头主要包括两部分数据:Mark Word(标记字段)、Klass Pointer(类型指针)。

  1. Mark Word:默认存储对象的HashCode,分代年龄和锁标志位信息。这些信息都是与对象自身定义无关的数据,所以Mark Word被设计成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据。它会根据对象的状态复用自己的存储空间,也就是说在运行期间Mark Word里存储的数据会随着锁标志位的变化而变化。
    技术分享图片
  2. Klass Point:对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
    然后还需要了解Monitor:
    Monitor可以理解为一个同步工具或一种同步机制,通常被描述为一个对象。每一个Java对象就有一把看不见的锁,称为内部锁或者Monitor锁。
    Monitor是线程私有的数据结构,每一个线程都有一个可用monitor record列表,同时还有一个全局的可用列表。每一个被锁住的对象都会和一个monitor关联,同时monitor中有一个Owner字段存放拥有该锁的线程的唯一标识,表示该锁被这个线程占用。现在话题回到synchronized,synchronized通过Monitor来实现线程同步,Monitor是依赖于底层的操作系统的Mutex Lock(互斥锁)来实现的线程同步。

1.6以前的synchronized只有无锁和有锁两种状态,在1.6之后对synchronized进行了优化,引入了偏向锁、轻量级锁

1.4 公平锁 VS 非公平锁

原文:https://www.cnblogs.com/jiezao/p/13680438.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!