JavaWeb——synchronized详解

news/2024/11/9 2:37:28/

目录

一、特性

1、互斥性

2、不可中断性

3、可重入性

二、使用

1、修饰普通方法

2、修饰静态方法

3、修饰代码块

三、锁机制


一、特性

1、互斥性

  • 当线程进入synchronized修饰的代码块时,就相当于加锁。
  • 当线程退出synchronized修饰的代码块时,就相当于解锁。

在同一时刻只允许一个线程持有某个对象的锁,此时只有一个线程使用该代码块。通过这种特性实现了多线程的协调机制。因此互斥性也成为了操作的原子性。

当已经有线程获取到该对象的锁时,其他线程也执行到该对象的被synchronized所修饰的方法也想获取锁进行加锁操作。但由于互斥性无法获取该锁,此时其他线程就会进入阻塞等待状态,直到之前的线程解锁后,其他线程才有机会获得该锁。

注:synchronized是非公平锁,并不会遵守先来后到的规则,而是同时竞争。是否能获得锁还得看操作系统的调度

2、不可中断性

当线程执行到的对象的锁被其他线程获得后,如果当前线程还想获得该锁,就只能进行阻塞等待,直到已获得该锁的线程释放锁后再尝试去获得锁。

3、可重入性

当一个线程请求另一个线程持有的锁时,请求的线程会阻塞,这是synchronized的不可中断性。但当线程去获取自己所拥有的锁时会请求成功而不会阻塞,这就是锁的可重入性

重入的原理:每个锁关联一个计数器和持有者线程,当计数器为0时候,这个锁被认为是没有被任何线程持有。

  • 当有线程持有锁时计数器进行自增并且记下锁的持有线程,当同一线程继续获取锁时计数器继续自增。
  • 当线程退出代码块时相应地计数器减1,直到计数器为0时锁被释放。此时该锁才能被其他线程获得。

同一线程的外层方法获得锁之后,内层方法可以直接获取改锁,可以避免内外层死锁(如下图)。


Object locker=new Object();synchronized(locker){synchronized(locker){}
}

synchronized是可重入锁,可以防止出现死锁

当线程进入了外层的 synchronized 方法时会拿到该锁,加上锁后将会执行代码。而内部又有一个 synchronized修饰的方法,此时也需要获取到同一把锁。想要获取之前的锁就必须要让外层的方法执行完后释放锁,但外层 synchronized 包裹的代码执行完则需要内部的代码先执行完才行。因此该方法无法继续执行,产生了死锁。

此时synchronized 是可重入锁就很好的解决了死锁的问题。

二、使用

1、修饰普通方法

使用synchronized修饰普通方法时,其作用域是整个方法,锁住的对象仅仅是当前对象。

synchronized void func1(){}

2、修饰静态方法

使用synchronized修饰静态方法时,其作用域时整个静态方法,因为静态方法属于类而不是对象,因此锁住的对象时当前类对象。

synchronized static void func2() {}

3、修饰代码块

使用synchronize修饰代码块时,其作用域是整个代码块,作用对象是括号中的对象,这个作用对象可以是指定的对象,也可以是类。

Object locker=new Object();synchronized (locker) {}
  • 在 Java 中,任何一个继承自 Object 类的对象,都可以作为锁对象。加锁操作实际上是在操作 Object 对象头中的一个标识位。
  • 如果括号中的是this,说明锁的对象就是当前对象。
  • 如果括号中的是 xxx.class,说明锁的对象就是类对象。

三、锁机制

synchronized:

  • 既是乐观锁,也是悲观锁。
  • 既是轻量级锁,也是重量级锁。
  • 轻量级锁基于自旋实现,重量级锁基于挂起等待实现。
  • 不是读写锁。
  • 是可重入锁。
  • 是非公平锁。


http://www.ppmy.cn/news/42758.html

相关文章

恒生电子面试题总结

CPU突然飙升,如何排查 1.监控cpu运行状态,显示进程运行信息列表 top -c 2. 按CPU使用率排序,键入大写的P P 3.用 top -Hp 命令查看占用 CPU 最高的线程 上一步用 top命令找到了那个 Java 进程。那一个进程中有那么多线程,不可…

Flutter 路由

前言: 路由的核心就是一个路由映射表,比如login 映射到 LoginPage,有了这样的映射,就可以根据名字去找寻对应的页面。 在Flutter 中,路由管理主要有两个类 Route 和 Navigator 一 Route 在Flutter 中,一个页面要想…

【2404. 出现最频繁的偶数元素】

来源:力扣(LeetCode) 描述: 给你一个整数数组 nums ,返回出现最频繁的偶数元素。 如果存在多个满足条件的元素,只需要返回 最小 的一个。如果不存在这样的元素,返回 -1 。 示例 1&#xff1…

https是什么?

HTTPS(HyperText Transfer Protocol Secure)是基于HTTP协议的安全版本,它使用SSL/TLS协议对数据进行加密和身份验证,从而保证通信的安全性和完整性。 HTTPS和HTTP的区别: 安全性:HTTPS通过SSL/TLS协议对数…

对数据库中索引及索引的数据结构的理解

索引就像是书或者论文的目录, 通过目录能够快速定位到某一章节, 加快了查找的效率, 减少插入和删除操作; 那么知道索引是干啥的了, 那索引的底层数据结构是什么呢??? 索引1 简述2 索引考虑的数据结构1 简述 如果数据库中没有索引, 查找的时候就会遍历整个表; 如果针对的是顺…

科普:java与C++的区别

Java与C是两种广泛使用的编程语言,它们在某些方面存在不同之处。本文将详细介绍Java与C的区别。 一、C与Java的历史 C语言是由Bjarne Stroustrup在20世纪80年代初期开发的一种面向对象编程语言,它是C语言的扩展。Java语言是由Sun Microsystems公司于20…

Python pandas和numpy用法参考(转)

以下是转载:Python pandas用法 - 简书介绍 在Python中,pandas是基于NumPy数组构建的,使数据预处理、清洗、分析工作变得更快更简单。pandas是专门为处理表格和混杂数据设计的,而NumPy更适合处...https://www.jianshu.com/p/840ba1…

今日刷题 动态dp比较简单状态机模型

题目描述:1186. 删除一次得到子数组最大和 一个很好的题解,受益匪浅 比较通俗易懂的dp - 删除一次得到子数组最大和 - 力扣(LeetCode): 我们定义f ( i ) 和 g ( i ),其中 f( i ) 表示不删除元素的情况下…