0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

synchronized知识合集1

jf_78858299 来源:JAVA旭阳 作者:JAVA旭阳 2023-05-11 11:07 次阅读
  • 线程安全
  • 什么是synchronized关键字?
  • synchronized实现方式
    • 1.修饰实例方法
    • 2.修饰静态方法
    • 3.修饰代码块
  • synchronized关键字底层原理
    • synchronized修饰实例方法
    • monitor锁是什么?
    • Java对象内存布局
    • synchronized修饰代码块
  • 锁优化
    • 自旋锁
    • 锁粗化
    • 锁消除
    • 锁膨胀
  • synchronized关键字实现单例模式
  • synchronized 和 volatile 的区别?
  • 尾语
  • 参考资料

图片

前言

今天我们来聊聊synchronized关键字,其可以同时保证三者,实现线程安全。

线程安全

在介绍synchronized关键字之前,我们得强调一下什么是线程安全,所谓线程安全:

当多个线程同时访问一个对象时, 如果不用考虑这些线程在运行时环境下的调度和交替执行, 也不需要进行额外的同步, 或者在调用方进行任何其他的协调操作, 调用这个对象的行为都可以获得正确的结果, 那就称这个对象是线程安全的

什么是synchronized关键字?

在 Java 早期版本中,synchronized 属于 重量级锁 ,效率低下;不过在 Java 6 之后,Java 官方对从 JVM 层面对 synchronized 较大优化,所以现在的 synchronized 锁效率也优化得非常不错。目前不论是各种开源框架还是 JDK 源码都大量使用了 synchronized 关键字

synchronized实现方式

synchronized的使用其实比较简单,可以用它来修饰实例方法和静态方法,也可以用来修饰代码块。我们需要注意的是synchronized是一个对象锁,也就是它锁的是一个对象。我们无论使用哪一种方法,synchronized都需要有一个锁对象

  1. 修饰实例方法
  2. 修饰静态方法
  3. 修饰代码块

1.修饰实例方法

synchronized修饰实例方法, 在方法上加上synchronized关键字即可。

public class SynchronizedTest1 {
    public synchronized void test() {
        System.out.println("synchronized 修饰 方法");
    }
}

此时,synchronized加锁的对象就是这个方法所在实例的本身,作用于当前实例加锁,进入同步代码前要获得 当前实例的锁

补充一个常见的面试题:构造方法可以用synchronized关键字修饰吗?

不能,也不需要,因为构造方法本身就是线程安全的

2.修饰静态方法

synchronized修饰静态方法的使用与实例方法并无差别,在静态方法上加上synchronized关键字即可

public static synchronized void test(){
       i++;
}

由于静态方法不属于任何一个实例对象,归整个类所有,不依赖于类的特定实例,被类的所有实例共享。给静态方法加synchronized锁,会作用于类的所有对象实例 ,进入同步代码前要获得 当前静态方法所在类的Class对象的锁

有一点我们需要知道:如果一个线程 A 调用一个实例对象的非静态 synchronized 方法,而线程 B 需要调用这个实例对象所属类的静态 synchronized 方法,是允许的,不会发生互斥现象, 因为访问静态 synchronized 方法占用的锁是当前类的锁,而访问非静态 synchronized 方法占用的锁是当前实例对象锁

3.修饰代码块

synchronized修饰代码块需要传入一个对象。

public class SynchronizedTest2 {
    public void test() {
        synchronized (this) {
            System.out.println("synchronized 修饰 代码块");
        }
    }
}

此时synchronized加锁对象即为传入的这个对象实例,指定加锁对象,进入同步代码库前要获得给定对象的锁 需要注意的是这里的**this **:

  1. synchronized(object) ,表示进入同步代码库前要获得 给定对象的锁
  2. synchronized(类.class) ,表示进入同步代码前要获得 给定 Class 的锁
  3. 最好不要使用 synchronized(String a) ,因为在 JVM 中,字符串常量池具有缓存功能, 如果我们多次加锁,会加锁在同一个对象上
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2967

    浏览量

    104739
  • 代码
    +关注

    关注

    30

    文章

    4786

    浏览量

    68569
  • 线程安全
    +关注

    关注

    0

    文章

    13

    浏览量

    2459
收藏 人收藏

    评论

    相关推荐

    关于labview的论文合集1

    关于labview的论文合集1
    发表于 09-23 13:45

    求解有没有类似于电子发烧友这样的分版块的知识合集

    求解有没有类似于电子发烧友这样的分版块的知识合集
    发表于 09-27 00:48

    有线通信的知识点大合集,绝对实用

    有线通信的知识点大合集,绝对实用
    发表于 01-17 08:24

    SPI协议的知识点大合集,绝对实用

    SPI协议的知识点大合集,绝对实用
    发表于 02-17 07:31

    stm32f103中的电路知识点大合集,错过后悔

    stm32f103中的电路知识点大合集,错过后悔
    发表于 02-21 06:49

    Synchronized multi-spark modul

    Synchronized multi-spark module (SMSM) for Electronic Ignition Devices (EID)
    发表于 12-29 09:09 840次阅读
    <b class='flag-5'>Synchronized</b> multi-spark modul

    电工威廉希尔官方网站 基础知识教程合集免费下载

    本文档的主要内容详细介绍的是电工威廉希尔官方网站 基础知识教程合集免费下载包括了:常用低压供配电系统 ,电工安全的基本知识 ,常用仪表与测量 。
    发表于 08-24 08:00 135次下载
    电工威廉希尔官方网站
基础<b class='flag-5'>知识</b>教程<b class='flag-5'>合集</b>免费下载

    Java并发编程中线程同步的常用手段synchronized用法

    变量的修改能够及时可见,获得锁的线程操作完毕后会将所数据刷新到共享内存区[1] 有序性:不解决重排序,但保证有序性 synchronized用法有三个: 修饰实例方法 修饰静态方法 修饰代码块 1. 修饰实例方法
    的头像 发表于 04-04 11:30 1172次阅读
    Java并发编程中线程同步的常用手段<b class='flag-5'>synchronized</b>用法

    电力基础知识合集

    电力基础知识合集
    发表于 03-14 16:35 0次下载

    详细介绍synchronized和Object的关键方法和虚拟机实现原理

    编程过程中经常会遇到线程的同步问题,Java 中对同步问题的解决方案比较多(synchronized、JUC、原子操作、volatile、条件变量等),其中synchronized 最方便、简单易用,也是java 编程中使用最多的临界区保护方案。
    的头像 发表于 03-13 10:06 1264次阅读

    synchronized知识合集2

    * 线程安全 * 什么是synchronized关键字? * synchronized实现方式 * 1.修饰实例方法 * 2.修饰静态方法 * 3.修饰代码块
    的头像 发表于 05-11 11:08 400次阅读

    synchronized的原理与四种用法介绍

    JDK提供的锁分两种,一种是JVM实现的synchronized,是java的关键字,因此在这个关键字作用对象的范围内都是可以保证原子性的,主要是依赖特殊的CPU指令。另一种是JDK提供的代码层面的锁Lock。
    的头像 发表于 06-09 16:13 1100次阅读
    <b class='flag-5'>synchronized</b>的原理与四种用法介绍

    synchronized 的几种错误用法

    synchronized 在我们平常工作中也是挺常用的, 对于摆脱多线程问题很有帮助。但是如果synchronized被错误使用时,可能会给我们带来很多麻烦。 在本文中,我们将讨论与同步相关的一些
    的头像 发表于 10-09 10:25 687次阅读

    synchronized的锁膨胀

    synchronized void sync1 ( ) { } // 锁的是SynchronizedTest.class对象 public static void sync2 ( ) { synchronized
    的头像 发表于 10-10 16:58 474次阅读
    <b class='flag-5'>synchronized</b>的锁膨胀

    C语言编程必备知识合集

    电子发烧友网站提供《C语言编程必备知识合集.zip》资料免费下载
    发表于 11-21 09:34 0次下载
    C语言编程必备<b class='flag-5'>知识</b><b class='flag-5'>合集</b>