首页 > 其他分享 >Synchronized

Synchronized

时间:2024-07-17 10:54:46浏览次数:14  
标签:同步 Synchronized synchronized 对象 monitorenter 线程 方法

Synchronized的表现形式

普通同步方法

  • 普通同步方法使用 synchronized 关键字修饰,锁对象是当前实例对象(即方法所属对象的实例)。
public synchronized void method() {
    // 锁对象是当前实例对象
}

静态同步方法

  • 静态同步方法使用 synchronized 关键字修饰,锁对象是当前类的 Class 对象。
public static synchronized void staticMethod() {
    // 锁对象是当前类的 Class 对象
}

同步方法块

  • 同步方法块可以指定任意对象作为锁对象。
public void method() {
    synchronized (lockObject) {
        // 锁对象是 synchronized 括号里配置的对象 lockObject
    }
}

Java对象头

锁的原理

JVM 基于 进 入和退出 Monitor 对象来实现 方法同步和代 码块 同步,但两者的 实现细节 不一 样 。代 码块 同步是使用 monitorenter和monitorexit 指令 实现 的,而方法同步是使用另外一种方式 实现 的, 细节 在 JVM 规 范里并没有详细说明。但是,方法的同步同 样 可以使用 这 两个指令来 实现 。 monitorenter指令是在 编译 后插入到同步代 码块 的开始位置,而 monitorexit 是插入到方法 结 束 处 和异常 处 , JVM 要保 证 每个 monitorenter 必 须 有 对应 的 monitorexit 与之配 对 。任何 对 象都有 一个 monitor 与之关 联 ,当且一个 monitor 被持有后,它将 处 于 锁 定状 态 。 线 程 执 行到 monitorenter 指令 时 ,将会 尝试获 取 对 象所 对应 的 monitor 的所有 权 ,即 尝试获 得 对 象的 锁 。 总结来讲就是两点
  • 标记锁的开始和结束
  • 在对象头中做标记

锁的升级 

偏向锁

当前线程加锁,先不释放锁,等到有线程来请求锁,并且当前线程已经执行完毕,才会释放锁。

轻量级锁

当锁被其他线程持有,该线程会一直通过自旋的方式来竞争锁。

重量级锁

当轻量级锁解锁时,存在锁的竞争,则会升级成为重量级锁,竞争失败的线程会进入堵塞队列。

锁的对比

标签:同步,Synchronized,synchronized,对象,monitorenter,线程,方法
From: https://blog.csdn.net/WYZFJHH/article/details/140487580

相关文章

  • [ABC339D]Synchronized Players
    题目大意给定一个N*N的地图,地图中#表示不能走,地图上有两个人,两个人每次走的方向都相同,每次只能向相同的方向走,,问最少几步就能相遇?题解这个题一看就是搜索,广搜,刚开始我陷入一个误区,让两个人分开记录状态,这个时候有个问题,当一个人能走,另一个人不能走的时候,步数就不同步,这个问题就......
  • 【转】-synchronized与Lock的区别与使用
    详解synchronized与Lock的区别与使用该博客转载自​淳安郭富城​的​详解synchronized与Lock的区别与使用1.引言:昨天在学习别人分享的面试经验时,看到Lock的使用。想起自己在上次面试也遇到了synchronized与Lock的区别与使用。于是,我整理了两者的区别和使用情况,同时,对synchroni......
  • [Java并发]Synchronized
    publicclassAtomicTest01{publicstaticinti=0;publicstaticvoidmain(String[]args){Runnabletask=newRunnable(){@Overridepublicvoidrun(){synchronized(this){tr......
  • 关于锁的使用,千万不要踩这个坑!(附带Synchronized详解和ZooKeeper、Redis等分布式锁详解
    1、分布式锁在分布式系统中,我们经常会使用各种锁来保证数据的一致性和并发安全。一些常见的分布式锁实现包括:基于ZooKeeper的分布式锁:使用ZooKeeper节点的特性来实现分布式锁。基于Redis的分布式锁:利用Redis的原子性操作和过期时间特性来实现分布式锁。Redlock算法:由......
  • synchronized 和 ReentrantLock的区别
    synchronized和ReentrantLock的区别  在讨论synchronized和ReentrantLock的区别前,我们先了解一下什么是公平锁和非公平锁  一、公平锁和非公平锁  从公平的角度来说,Java中的锁总共可分为两类:公平锁和非公平锁。但公平锁和非公平锁有哪些区别?孰优孰劣呢?在Java......
  • synchronized 和 ReentrantLock (Lock)区别,优劣对比
    两种方法都是为了确保多线程环境中的线程安全,但它们使用了不同的同步机制:synchronized关键字和Lock接口。下面详细对比这两种方法的区别、优缺点以及适用场景。synchronized关键字publicsynchronizedvoidaddSession(HttpSessionsession){if(session!=null){......
  • java synchronized 保护线程安全
    前言工作中自己实现了一个MySessionContext类,在实现addSession方法的时候,考虑到会有线程不安全问题,这里需要使用synchronized关键字来保护线程安全。理解synchronized关键字需要了解多线程和线程安全的基本概念。在多线程环境中,多个线程可以同时访问共享资源(例如内存中的变量......
  • abstract 的 method 是否可同时是 static,是否可同时是 native,是否可同时是 synchroni
    在Java中,abstract方法不能同时是static、native或synchronized。让我们详细解释每种情况,并提供相应的代码示例和解释:abstract方法不能是static:abstract方法必须被子类实现,而static方法是与类相关的,而不是与实例相关的。因此,不能将一个方法同时声明为abstract和......
  • synchronized原理
    锁的四种状态001:无锁。101:偏向锁。00:轻量级锁。此状态下,线程可能通过自旋的方式竞争锁。10:重量级锁。线程阻塞被挂起,需要从用户态切换到内核态进行系统调用,获取CPU调度权,对性能有较大影响。轻量级锁,重量级锁是2Bit锁等级顺序:001无锁--》101偏向锁--》00轻......
  • synchronized内置锁和volatile关键字
    synchronized内置锁对象锁和类锁:对象锁是用于对象实例方法,或者一个对象实例上的,类锁是用于类的静态方法或者一个类的class对象上的。我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。但是有一点......