Java_synchronized的锁对象之对象锁和类锁

2023-11-13

具体知识学习与

https://blog.csdn.net/yansuoo/article/details/51248281

https://www.jianshu.com/p/6586d9f3b515

下面是自己的理解+代码:

一.前置知识:

       java的对象锁和类锁:java的对象锁和类锁在锁的概念上基本上和内置锁是一致的,但是,两个锁实际是有很大的区别的,对象锁是用于对象实例方法,或者一个对象实例上的,类锁是用于类的静态方法或者一个类的class对象上的。我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。但是有一点必须注意的是,其实类锁只是一个概念上的东西,并不是真实存在的,它只是用来帮助我们理解锁定实例方法和静态方法的区别的

二.代码理解

  1. synchronized(对象锁):两种;
  2. synchronized(this){ 
    //互斥代码
    } 
    或:
    private Object lock = new Object();
    public void test1(){
        synchronized(lock){ 
        //互斥代码
        }
    }
    

    这里的this,指的是调用它的实例对象,即锁就是这个这里对象 ; 而lock锁则是任意对象锁(所有需要这个对象的锁的方法都不能同时执行),有些许的不同(所有线程线程能共用该锁)。

  3. 代码:

    Ticket t1=new Ticket();   Ticket t2=new Ticket(); Ticket t3=new Ticket();
    t1.start();     t2.start();   t3.start();
    //测试三个线程 	   
    class Ticket extends Thread{
        private int num=100;
        //Object obj = new Object();
        public void run() {
    	while(true) {
                //synchronized (obj) 
                synchronized (this) {
                   if(num>0)System.out.println(Thread.currentThread().getName()+".."+num--);                  
    	        try {
    		    Thread.sleep(100);
    		}catch (Exception e) {}
    	    }
    		System.out.println(Thread.currentThread().getName()+":释放");
            }
        }
    }

    此时线程1.2.0.交替执行,但注意下一次线程1.2.0像执行必须对应锁释放,换句话说这里三个线程对象对应了三个锁,只锁自己,不能锁别人,cpu可以切换其他线程执行,只要没被锁。  而代码注释的第二种结果是:                  与上面同理,也是只能锁自己。是把当前这个对象的成员变量(object)当做锁,其实三个线程对象有三个不同的object对象,因为这个变量不共享。

  4. tips:这样加锁的好处 (这是最常用的高并发场景下要锁住某个方法所用的操作) :如果这时用synchronized来修饰代码块:synchronized(obj){obj.testsy();},那么这个方法加锁的对象是obj这个对象,跟执行这行代码的对象没有关系,当一个线程执行这个方法时,这对其他同步方法时没有影响的,因为他们持有的锁都完全不一样。

    private Object lock = new Object();
    public void test1(){
        synchronized(lock){ 
        //互斥代码
        }
    }
    

     

  5. private static Object lock = new Object();

    但如果任意对象锁改为静态的,则可以实现互斥了,所有线程共享这个锁(共享这个变量)。                                       

  6. synchronized(类锁)

  7. 对于类锁来说其实和对象锁一样只是为了区别静态方法和普通方法,对于多个线程,都是一把锁,和第5点的情况一样

    synchronized(A.class){ 
    //互斥代码
    }
    

    tips:object.getClass()和A.class实际意义不同,并且对于前者来说,出现多态时,可能会有问题

  8. 每个线程执行都得等内阁唯一的一把锁释放。

三:一点解释:

    Thread.sleep():强制线程休眠未来*ms时间内不进入CPU进行竞争,进入阻塞状态,给其他线程机会执行,但是,他不会释放锁;且 *毫秒过去之后,这时候也许另外一个线程正在使用CPU,那么这时候操作系统是不会重新分配CPU的, 直到那个线程挂起或结束;况且,即使这个时候恰巧轮到操作系统进行CPU 分配,那么当前线程也不一定就是总优先级最高的那个,CPU还是可能被其他线程抢占去。也不一定会论到调度他。

    线程获得对象锁的同时,也可以获得该类锁,即同时获得两个锁,这是允许的。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java_synchronized的锁对象之对象锁和类锁 的相关文章

  • pyechart基本绘图(python)

    charts base 基本图表篇 本篇文档为 pyecharts 基本图表详情文档 介绍了关于 pyecharts 各类基本图表的细节 图表详细配置请参考 图表配置篇 基本图表类 Bar 柱状图 条形图 Bar3D 3D 柱状图 Boxp

随机推荐

  • STM32使用HAL库中外设初始化MSP回调机制及中断回调机制详解

    STM32使用HAL库之Msp回调函数 1 问题提出 在STM32的HAL库使用中 会发现库函数大都被设计成了一对 HAL PPP PPPP Init HAL PPP PPPP MspInit 而且HAL PPP PPPP MspInit函
  • 统计学学习笔记:L1-总体、样本、均值、方差

    目录 一 总体和样本 二 集中趋势分析 2 1 均值 2 1 1 样本均值 2 1 2 总体均值 2 2 众数 中位数 三 离散趋势分析 3 1 总体方差 3 2 样本方差 3 3 标准差 一 总体和样本 比如要计算全国男性的平均身高 但是
  • 国内首个生成式AI标准发布,aiXcoder为核心编写单位

    3月20日 首届生成智能产业峰会在北京成功举办 aiXcoder凭借其在生成式人工智能技术方面的卓越表现 被评选为核心编写单位 深度参与 生成式人工智能技术及产品评估方法 系列标准的研制和发布 万物智生 百业赋能 首届生成智能产业峰会于3月
  • c语言逐行存储到txt,c语言逐行读取txt文件数据

    我写的是linux下的程序 一个文件叫MYFILE里面是一行一行的写内容的 我可以使用fgets函数 1 函数名 fgets 2 声明 char fgets char buf int bufsize FILE stream 3 头文件 st
  • Android JNI2--C++基础

    1 基础结构 C 标准支持 include
  • MATLAB之极坐标绘图

    目标是要绘制一个二维的极坐标彩色图 输入参数有三个 一个是角度 一个是半径 一个是颜色 说到极坐标绘图 第一个想到的就是polar啦 那就先试试吧 1 polar绘图 polar函数用来绘制极坐标图 调用格式为 polar theta rh
  • 数据结构-最小生成树、prim算法、kruskal算法

    目录 最小生成树 Prim算法 普里姆 Kruskal算法 科普斯卡尔 prim算法的实现思想 Kruskal算法的实现思想 最小生成树 如果一个连通图本身就是一棵树 则其最小生成树就是它本身 只有连通图才有生成树 非连通图只有生成森林 P
  • telnet 使用教程(新手篇)及问题集锦

    telnet经常用于测试网络及端口占用情况 具体使用如下 测试端口命令 telnet host 端口 例 telnet 192 168 31 100 8081 连接失败表示端口未占用 否则表示被占用 如下 8080端口已占用 例 telne
  • RACI模型

    1 什么是RACI模型 释义 RACI是一个相对直观的模型 用以明确组织变革过程中的各个角色及其相关责任 我们知道 变革过程是不可能自发或者自动进行的 必须有人对其进行作用 促使进程发生变化 因而 就很有必要对谁做什么 以及促发什么样的变革
  • dracut 使用笔记

    dracut 维基 https dracut wiki kernel org index php Main Page dracut 官方手册 https www kernel org pub linux utils boot dracut
  • luaframework框架中将protobuf文件转成lua文件

    在luaframework框架中提供了通讯工具protobuf 需要将protobuf文件转成lua文件使用 按步骤来 1 下载并安装Python 我下载的版本是2 7 8 这个去Python官网下载即可 我的Python安装目录如图 2
  • Mybatis-plus 集合分页方法

    一 静态分页 1 POM引用
  • 使用matplotlib做动态排名图

    数据源 数据 过程 1 将数据进行持久化存储 先使用pandas的read csv函数从网页端直接读取数据 并筛选部分数据 url https gist githubusercontent com johnburnmurdoch 4199d
  • 【网页设计】HTML+CSS 实现简单宣传网页设计展示

    网站设计包含 1 图片设计 有背景图片和颜色 同时有一张图片悬浮 2 字体设计 设置字体大小 颜色等内容 3 按钮设计 完成点击按钮后弹出视频窗口的功能 4 视频窗口 视频窗口包括视频进度条 调节音量 窗口全屏 调节视频播放速度以及画中画等
  • NetworkManager和network

    一 NetworkManager做了什么 NetworkManager确保网络连接正常 当检测到系统中没有网络配置但有网络设备时 NetworkManager会创建临时连接以提供连接 通过不同的工具 GUI nmtui nmcli 提供管理
  • 操作系统 页面置换算法:LRU和FIFO

    LRU Least Recently Used 最少使用页面置换算法 顾名思义 就是替换掉最少使用的页面 FIFO first in first out 先进先出 页面置换算法 这是的最早出现的置换算法 该算法总是淘汰最先进入内存的页面 即
  • flutter Image图片控件-知识点

    图片是大家做项目中常用最大控件之一 本篇针对项目中经常用的功能 做些总结 ImageProvider 是一个抽象类 主要定义了图片数据获取的接口load 从不同的数据源获取图片需要实现不同的ImageProvider 如AssetImage
  • Linux搭建SVN服务器

    1 安装SVN 官网下载 http subversion apache org packages html SVN客户端 TortoiseSVN 官网下载 http tortoisesvn net downloads html yum in
  • SpringCloud——GateWay入门

    客户由发送请求由Nginx服务器已经将请求转发到一个服务器上 但是服务之前我们还需要一个网关将这些请求进一步加工处理到服务上 这一步就是GateWay GateWay 1 GateWay服务是不需要进入以下jar包
  • Java_synchronized的锁对象之对象锁和类锁

    具体知识学习与 https blog csdn net yansuoo article details 51248281 https www jianshu com p 6586d9f3b515 下面是自己的理解 代码 一 前置知识 jav