首页 > 编程语言 >【Java 并发编程】synchronized

【Java 并发编程】synchronized

时间:2023-10-17 11:47:48浏览次数:45  
标签:同步 Java synchronized 对象 编程 实例 线程 指令

synchronized 关键字

synchronized 是 Java 中的一个关键字,翻译成中文是同步的意思,主要解决的是多个线程之间访问资源的同步性,可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。

使用方法

修饰实例方法

给当前对象实例加锁,进入同步代码前要获得 当前对象实例的锁 。

synchronized void method() {
    ...
}

修饰静态方法

给当前类加锁,会作用于类的所有对象实例 ,进入同步代码前要获得 当前 class 的锁。

synchronized static void method() {
    ...
}

因为静态成员不属于任何一个实例对象,归整个类所有,不依赖于类的特定实例,被类的所有实例共享。

修饰代码块

对括号里指定的对象/类加锁:

  • synchronized(object):表示进入同步代码库前要获得 给定对象 的锁。

  • synchronized(类.class):表示进入同步代码前要获得 给定 Class 的锁

synchronized(this) {
    ...
}

synchronized 底层原理

synchronized 同步语句块

synchronized 同步语句块的实现,使用的是两条指令:monitorenter 指令 和 monitorexit 指令。

在 Java 虚拟机(HotSpot)中,Monitor 是基于 C++ 实现的,由 ObjectMonitor 实现的,每个对象中都内置了一个 ObjectMonitor 对象。

另外,wait/notify 等方法也依赖于 monitor 对象,这就是为什么只有在同步的块或者方法中才能调用 wait/notify 等方法,否则会抛出 java.lang.IllegalMonitorStateException 的异常的原因。

monitorenter 指令

monitorenter 指令:指向同步代码块的开始位置。

当执行 monitorenter 指令时,线程试图获取锁也就是获取 对象监视器 monitor 的持有权,即线程会尝试获取对象的锁,如果锁的计数器为 0,则表示锁可以被获取,获取后将锁计数器加 1。

image

monitorexit 指令

monitorexit 指令:则指明同步代码块的结束位置。

只有对象锁的的拥有者线程才可以执行 monitorexit 指令,来释放锁。在执行 monitorexit 指令后,将锁计数器设为 0,表明锁被释放,其他线程可以尝试获取锁。

image

synchronized 修饰方法

synchronized 修饰的方法会使用 ACC_SYNCHRONIZED 标识,该标识指明了该方法是一个同步方法。

JVM 通过该 ACC_SYNCHRONIZED 访问标志来辨别一个方法是否声明为同步方法,从而执行相应的同步调用:

  • 如果是实例方法,JVM 会尝试获取 实例对象 的锁。

  • 如果是静态方法,JVM 会尝试获取 当前 class 的锁。

标签:同步,Java,synchronized,对象,编程,实例,线程,指令
From: https://www.cnblogs.com/larry1024/p/17769311.html

相关文章

  • 【Java 并发编程】ReentrantLock
    目录ReentrantLock公平锁和非公平锁synchronized和ReentrantLock有什么区别?ReentrantLockReentrantLock是一个可重入的互斥锁,又被称为“独占锁”。ReentrantLock类实现了Lock,它拥有与synchronized相同的并发性和内存语义,但是添加了类似锁投票、定时锁等候和可中断锁等......
  • 【Java 并发编程】ThreadLocal
    目录ThreadLocalThreadLocal实现线程隔离的原理ThreadLocal内存泄漏场景ThreadLocalThreadLocal是一个将在多线程中为每一个线程创建单独的变量副本的类;当使用ThreadLocal来维护变量时,ThreadLocal会为每个线程创建单独的变量副本,避免因多线程操作共享变量而导致的数据不......
  • java serverlets使用数据源连接oracle数据库,并执行查询操作代码
    packagechap03;importjava.io.IOException;importjava.io.PrintWriter;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.PreparedStatement;importjava.sql.Statement;importjava.u......
  • 【Java 并发编程】LockSupport
    目录简介方法介绍阻塞和唤醒示例示例1示例2示例3阻塞对象blocker的作用和显式锁、隐式锁等待唤醒的区别简介java.util.concurrent.locks.LockSupport是一个工具类,提供了基本的线程阻塞和唤醒功能,它是创建锁和其他同步组件的基础工具,内部是基于sun.misc.Unsafe类实现的。Lo......
  • Javascript报错:Uncaught TypeError: $(...).slide is not a function
    检查网站的时候,发现网页出现一个报错,UncaughtTypeError:$(...).slideisnotafunction同时,平时没有问题的轮播图,也不轮播了。检查并解决步骤如下: 1.顺着错误提示点过去,发现就是slide函数无法运行。查看相关介绍,表示是jq文件进行了重复引用,且版本不同 如下图相关资料描......
  • 编程到底难在哪里?
    大家好,我是陶朱公Boy,一个认真生活,总想超越自己的程序员。前言知乎上有一个提问:编程到底难在哪里?↓↓↓今天,我们就这个话题,一起来做个讨论。首先调研一下,程序员的你,觉得编程难吗?如果觉得难,那到底难在哪里?有哪些地方,是你觉得自己在目前的工作或学习中,自己尚有欠缺的,需要花时......
  • Java IO 与 NIO:高效的输入输出操作探究
    引言输入输出(IO)是任何编程语言中的核心概念,而在Java中,IO操作更是应用程序成功运行的基石。随着计算机系统变得越来越复杂,对IO的要求也日益增加。在本文中,我们将探讨JavaIO和非阻塞IO(NIO)的重要性以及如何在Java中实现高效的输入输出操作。传统IO(阻塞IO)传统IO是大多数开发人员熟......
  • #关于编程小白的初次学习
    关于编程小白的学习之对前后端的理解及选择​据个人理解我把数据库比作一位数学出题者,而后端要做的就是解出这道数学题,并将这个答案交给前端。对于前端,后端给的答案终究还是太过枯燥无味,于是前端的任务就是把这个答案美化,让阅卷老师(用户)能看得更舒服,这样我们的分数才能高,当然这......
  • 这篇记录一下C#和java中的http request的测试
    1.在c#中,测试http的,一般做一个mock的httpContext,然后里面的request和response都使用mock的,这样设置好后,就可以测试controller2.在java中,因为是httpservelet这些,所以实例化测试创建mock的httprequest这些https://www.baeldung.com/java-httpservletrequest-mock@Testvoid......
  • java学习第一天-安装JDK,运行Hello.java
    卸载JDK删除java的安装目录删除JAVA_HOME删除path下关于java的目录cmd下输入java-version安装JDK华为云JDK下载链接,首先下载JDK下载对应版本安装JDK设置安装路径配置环境变量打开环境变量新建系统变量-->JAVA_HOME配置path变量,新建%JAVA_......