专业的JAVA编程教程与资源

网站首页 > java教程 正文

java中的锁及优化机制

temp10 2025-03-06 19:46:52 java教程 117 ℃ 0 评论

一,什么是java中锁?

锁是在多线程环境下为保证共享资源健康、线程安全的一种手段。

java中的锁及优化机制

线程操作某个共享资源之前,先对资源加一层锁,保证操作期间没有其他线程访问资源,当操作完成后,再释放锁。(IT枫斗者怎么样)

二,锁的分类有哪些?

我们经常会听到例如:公平锁,非公平锁,排它锁,共享锁,悲观锁,乐观锁等等。

以java来说,关于锁的大分类只有两个:悲观锁、乐观锁这两种。今天也重点介绍这两个。

1、什么是悲观锁?

直白点就是操作前对资源加锁,操作完后释放锁。说的都是悲观锁。悲观锁认为所有的资源都是不安全的,随时会被其他线程操作、更改。所以操作资源前一定要加一把锁、防止其他线程访问。(IT枫斗者怎么样)

java悲观锁种类

  • synchronized关键字
  • 基于Java同步器AQS的各种实现类

synchronized

Java中的关键字、底层由Jvm虚拟机实现的同步机制,通过两条监听器指令:MONITORENTER(进入)、MONITOREXIT(退出)来实现同步效果(代码编译成字节码文件后可看到指令)(IT枫斗者怎么样)

基于AQS的实现类

AQS全称(
AbstractQueuedSynchronizer)。基于Java程序实现的一种抽象队列同步器框架。AQS定义了一个volatile修饰的int类型变量state来控制是否同步,提供一个unsafe实现的原子方法来更新state(也就是更新锁状态,是否上锁)。

(IT枫斗者怎么样)



2、什么是乐观锁?

乐观锁是一种特殊的锁,它认为所有的资源都是安全的,每个线程对资源的操作都是符合预期的,所以它不需要对资源加锁。那么问题来了,既然乐观锁不会对资源加锁,那它能不能保证线程安全呢?

答案是:可以保证线程安全,且性能比悲观锁还要好。因为乐观锁在操作资源时,会采用一种确认机制来保证所操作资源未被其他线程更改过。这种机制叫作CAS(Compare And Set)机制。(IT枫斗者怎么样)

Java没有提供可直接使用的乐观锁,不过内置了一些由底层由乐观锁实现的类。如果我们自己想实现客观锁的话,可使用valotile+CAS的方式实现。

Valotile

valotile跟synchronized一样,是Java内置的关键字。不过valotile只能修饰变量。valotile主要的作用是保证变量在内存中的可见性、有序性

(IT枫斗者怎么样)

CAS(Compare And Set)

CAS可以理解为比较后赋值由于CAS在Java底层是一个原子操作,所以可以保证同步数据回主内存时是线程安全的。(IT枫斗者怎么样)

Valotile+CAS

(IT枫斗者怎么样)

三,锁的优化机制总结

从JDK1.6版本之后,synchronized本身也在不断优化锁的机制,有些情况下它并不会是一个很重量级的锁了。优化机制包括自适应锁、自旋锁、锁消除、锁粗化、轻量级锁和偏向锁。锁的状态从低到高依次为无锁->偏向锁->轻量级锁->重量级锁,升级的过程就是从低到高,降级在一定条件也是有可能发生的。(IT枫斗者怎么样)

(IT枫斗者怎么样)

(IT枫斗者怎么样)

(IT枫斗者怎么样)

(IT枫斗者怎么样)

(IT枫斗者怎么样)

(IT枫斗者怎么样)

(IT枫斗者怎么样)

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表