码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【面试题】sychronized


    sychronized

    • 1. 如何使用 synchronized 关键字?
      • 1.1 修饰静态方法
      • 1.2 修饰实例方法
      • 1.3 在方法内部的同步代码快
    • synchronized注意事项
    • 2. synchronized 关键字的底层原理
      • 2.1 同步代码块
      • 2.2 同步方法
    • 3. 特性
      • 如何保证三大特性
      • 3.2 可重入特性
        • 3.2.1 可重入原理
        • 3.2.2 可重入的好处
      • 3.3 不可中断特性
    • 4. [synchronized底层到底是怎么加锁的](https://blog.csdn.net/yzx3105/article/details/128970276)
    • 5. [synchronized的锁重入、锁消除、锁升级原理](https://blog.csdn.net/yzx3105/article/details/128972161)
    • 6. [为什么说synchronized是重量级锁](https://blog.csdn.net/yzx3105/article/details/127739142)
    • 7. 平时写代码如何对sychronized优化
    • 8. [synchronized(string)使用](https://blog.csdn.net/yzx3105/article/details/127654440)

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

    1. 如何使用 synchronized 关键字?

    Synchronized是一个同步关键字,在某些多线程场景下,如果不进行同步会导致数据不安全,而Synchronized关键字就是用于代码同步。什么情况下会数据不安全呢,要满足两个条件:一是数据共享(临界资源),二是多线程同时访问并改变该数据。

    1.1 修饰静态方法

    修饰静态方法,对当前类的Class对象加锁,也就是SyncDemo.class对象

    public class SynDemo {
        static int value = 0;
        public synchronized static void testStaticSync() {
            value++;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1.2 修饰实例方法

    修饰实例方法,对当前实例对象this加锁

    public class SynDemo {
        int i = 0;
        int x = 0;
        public synchronized void  testSync() {
            i++;
            x++;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    1.3 在方法内部的同步代码快

    修饰代码块(锁指定对象/类)
    synchronized(object) 表示进入同步代码库前要获得 给定对象的锁。
    synchronized(类.class) 表示进入同步代码前要获得 给定 Class 的锁

    synchronized注意事项

    (1)定义一个TestThread类,继承自Thread
    (2)TestThread的内部持有一个SycDemo对象
    (3)TestThread的run方法内部调用SyncDemo对象的testSync方法执行synchronized修饰的同步方法。

    public class SynDemo {
        int i = 0;
        int x = 0;
        // 争抢对象SyncDemo的锁
        public synchronized void  testSync() {
            i++;
            x++;
        }
     
        static class TestThread extends Thread {
            SynDemo lock;
            TestThread(SynDemo lock) {
                this.lock = lock;
            }
            @Override
            public void run() {
                lock.testSync();
            }
        }
     
        public static void main(String[] args) {
            // 锁对象lock1
            SynDemo lock1 = new SynDemo();
            // 锁对象lock2
            SynDemo lock2 = new SynDemo();
            
            TestThread threadA = new TestThread(lock1);
            TestThread threadB = new TestThread(lock2);
            
            threadA.start();
            threadB.start();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    像这种方式,threadA和threadB是达不到互斥的目的的,因为threadA锁住的是lock1对象;然而thread锁住的是lock2对象。完全争抢的不是同一个锁。
    在这里插入图片描述
    那如果要使得threadA和threadB达到同步的目的,应该怎么做?

    需要threadA和threadB争抢同一把锁,争抢同一个同一个对象的锁才可以,也就是像下面那样,也就是threadA和threadB都使用同一对象锁ock1,这样才是正确的:

    public static void main(String[] args) {
        // 只有一个锁对象lock1
        SynDemo lock1 = new SynDemo();
        // 两个线程对同一个对象锁进行争抢
        TestThread threadA = new TestThread(lock1);
        TestThread threadB = new TestThread(lock1);
     
        threadA.start();
        threadB.start();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述
    对于synchronized修饰static的方法,synchronized锁的是这个类对象,由于类对象只有一个,所以不同线程同时通过类调用这个方法的时候就能互斥的效果。

    2. synchronized 关键字的底层原理

    2.1 同步代码块

    synchronized 同步语句块的实现使用的是 monitorenter 和 monitorexit 指令,其中 monitorenter 指令指向同步代码块的开始位置,monitorexit 指令则指明同步代码块的结束位置。

    2.2 同步方法

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

    3. 特性

    如何保证三大特性

    3.2 可重入特性

    3.2.1 可重入原理

    synchronized是可重入锁,内部锁对象中会有一个计数器记录线程获取几次锁,在执行完同步代码块时,计数器的数量会-1,知道计数器的数量为0,就释放这个锁。

    3.2.2 可重入的好处

    1. 可以避免死锁
    2. 可以让我们更好的来封装代码

    3.3 不可中断特性

    一个线程获得锁后,另一个线程想要获得锁,必须处于阻塞或等待状态,如果第一个线程不释放锁,第二个线程会一直阻塞或等待,不可被中断。

    4. synchronized底层到底是怎么加锁的

    5. synchronized的锁重入、锁消除、锁升级原理

    无锁-》偏向锁-》轻量级锁-》重量级锁
    锁可以升级不可以降级,但是偏向锁状态可以被重置为无锁状态。
    在这里插入图片描述

    6. 为什么说synchronized是重量级锁

    7. 平时写代码如何对sychronized优化

    1.减少sychronized的范围,同步代码块尽量短,减少同步代码块的执行时间,减少锁竞争。
    2.降低sychronized锁的颗粒度(HashTable锁定方法 和 ConcurrentHashMap局部锁定,锁定桶)
    在这里插入图片描述
    3.读写分离(读取不加锁,增加删除的时候加锁)
    ConcurrentHashMap,CopyOnWriteArrayList,CopyOnWriteSet

    8. synchronized(string)使用

    文章出处:https://www.bilibili.com/video/BV1aJ411V763?p=29&vd_source=b901ef0e9ed712b24882863596eab0ca
    参考链接:https://blog.csdn.net/tongdanping/article/details/79647337
    如何使用:https://blog.csdn.net/chenzengnian123/article/details/122683126

  • 相关阅读:
    【ARM入门】ARM、SOC、ARM授权 概念篇
    上海亚商投顾:沪指放量反弹 医药、AI概念股集体走强
    一文详解头层反绒皮和二层反绒皮的区别,别再傻傻分不清了!
    长安链fact示例合约statedb存储数据原文带有cmecv1.0原因分析
    计算机毕业设计Java公司薪酬管理系统(源码+系统+mysql数据库+Lw文档)
    电脑重装系统后当前安全设置不允许下载该文件
    跨域请求方案整理实践
    图像显示在对话框上的一些问题
    IDM下载器安装cmd注册
    利用NVIDIA DALI读取视频帧
  • 原文地址:https://blog.csdn.net/yzx3105/article/details/126670053
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号