Synchronized锁对象详解

2023-11-01

synchronized 是我们的同步的一种选择,加锁就要有对应的钥匙
这个钥匙分为 当前类对象当前class对象 , 第三方对象

synchronized 可以修饰 变量方法
我们以方法举例可以有如下的几种情况:

  • 修饰静态方法 , 这里默认的锁就是当前类的class对象
public synchronized static void t0(){
	// code
}
  • 修饰非静态方法 , 这里默认的锁就是当前类的实例对象
public synchronized void t1(){
	// code
}
  • 同步代码块中锁

    • 锁一个对象
    public void t2() {
          synchronized (o) {
    		// code
    	}
    }
    
    • 锁一个对象的class
    public void t3() {
          synchronized (o.getClass()) {
    		// code
    	}
    }
    

经过验证,总结如下:

我们只有两种锁,对象锁和Class锁,Class锁允许所有的Class相同的对象都拿到资源,对象锁就单纯的只有这个对象才能获取到锁。其中,静态都是 锁类的 class。其他的时候我们都是习惯于单纯的锁对象。



具体的验证代码如下:

public class MySynchronized {
    public int id;
    public String name;
    
    public Object o = new Object();

    public synchronized static void t0(){
        System.out.println(Thread.currentThread().getName()+"  invoked  "+" static t0 method start");
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"  invoked  "+" static t0 method end");
        System.out.println();

    }

    public synchronized void t1()  {
        System.out.println(Thread.currentThread().getName()+"  invoked  "+"t1 start");
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+"  invoked  "+"t1 end");
        System.out.println();
    }

    public void t2() {
        synchronized (o) {
            System.out.println(Thread.currentThread().getName()+"  invoked  "+"t2 start");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"  invoked  "+"t2 end");
            System.out.println();
        }
    }

    public void t3() {
        synchronized (o.getClass()) {
            System.out.println(Thread.currentThread().getName()+"  invoked  "+"t3 start");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"  invoked  "+"t3 end");
            System.out.println();
        }
    }

    public static void main(String[] args) {
        // TODO 同步方法测试
        // 同一个实例对象,哪个线程先调哪个就先得
        MySynchronized test1 = new MySynchronized();
        Thread t1 = new Thread(test1::t1);
        Thread t2 = new Thread(test1::t1);
        // thread1.start();
        // thread2.start();

        // TODO 静态方法测试
        // 锁的是class,同一个class 先到先得
        Thread t3 = new Thread(MySynchronized::t0);
        Thread t4 = new Thread(MySynchronized::t0);
        Thread t5 = new Thread(MySynchronized::t0);
        // t3.start();
        // t4.start();
        // t5.start();

        // TODO 测试不同实例的 成员变量
        System.out.println(new MySynchronized().o.equals(new MySynchronized().o));
        MySynchronized temp1 = new MySynchronized();
        MySynchronized temp2 = new MySynchronized();
        Thread t6 = new Thread(temp1::t2);
        Thread t7 = new Thread(temp2::t2);
        // t6.start();
        // t7.start();
        // TODO 测试同实例 成员变量
        Thread t8 = new Thread(temp2::t2);
        // t7.start();
        // t8.start();

        // TODO 测试不同实例 成员变量.class
        Thread t9 = new Thread(temp2::t3);
        Thread t0 = new Thread(temp2::t3);
        t0.start();
        t9.start();

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

Synchronized锁对象详解 的相关文章

随机推荐

  • 等级保护2.0四级通用要求测评方法

    等级保护2 0四级通用要求测评方法
  • Python 使用 smtp ssl 模式 发送邮件与附件

    参考 发送邮件简单入门 以qq邮箱 163邮箱为例 https blog csdn net qq 38661599 article details 81013834 smtp ssl 模式 发送邮件 与 附件 https www cnblo
  • Vue-组件之间的的数据传递

    目录 组件的使用 注册全局组件 props组件 组件之间样式冲突问题 父 子关系传递 子 父关系传递 兄弟之间的传递 ref引用 什么是组件 只要是 vue后缀的文件都是一个组件 而组件之间是独立的 相互之间没有关系 当在使用组件的时候 根
  • 数据库 数据结构设计实验报告 包括er图转关系模式

    年级 班号 组号 学号 专业 日期 姓名 实验名称 实验一 数据库设计 实验室 实验 目的 或 要求 1 通过了解具体的应用案例体验数据库的应用 以及数据库系统和应用程序之间的关联关系 从而进一步理解数据 数据库 DBMS基本概念知识 2
  • chatgpt赋能python:如何利用Python绘制窗口

    如何利用Python绘制窗口 作为一门高级编程语言 Python具备强大的绘图能力 可以用来创建各种窗口应用程序 本篇文章将介绍如何利用Python绘制窗口 并分析其在搜索引擎优化方面的作用 绘制窗口的基本步骤 要利用Python绘制窗口
  • 测试-python筑基1.1-(列表/元组/字典/集合/字符串)

    列表 列表 列表 一种将多个数据组合到一起的容器 标识符 关键字 list 给列表赋值变量名的时候 不要用关键字 list 1 定义一个空列表 list 2 1 2 3 4 5 定义一个有值的列表 不是数组 print type list
  • Spring+mybatis+Druid+AbstractRoutingDataSource配置多数据源切换进行读写分离

    自我理解是这样的 首先配置事务管理器设置设置方法是否是只读创建一个DynamicDataSourceTransactionManager的类继承DataSourceTransactionManager去重写doBegin与doCleanup
  • SPSS数据分析中出现的常见问题总结

    总结最近数据分析过程中遇到的一些问题的思考 1 问卷中多选题的录入与分析 2 数据分析流程的第一步 对所分析的样本数据本身的特征结构进行预分析 3 根据数据中的某个因素的几个水平来分析数据总体的差异性 4 根据数据中的变量之间的相关性 了解
  • 如何使用 MSYS2 编译最新版的 coreutils 源码(目前最新版本为 coreutils-9.4)

    文章目录 一 coreutils 源码下载 二 MSYS2 安装编译工具 1 pacman Suy 更新软件仓库 2 pacman S msys gcc 安装gcc 3 pacman S msys make 安装make工具 4 解压缩 c
  • python基础练习(猜拳游戏、扎金花游戏、购物小程序)

    猜拳游戏 需求分析 使用面向对象和python的基础语法 运用简单的逻辑处理实现猜拳游戏 要求游戏可以多次玩耍 要求统计分数 要求可以选择角色 玩家自己的类 class Owns chose 1 石头 2 剪刀 3 布 def init s
  • Java foreach语句的用法

    Java foreach语句用法使用 如何使用Java1 5出现的foreach语句 foreach语句 for循环 foreach语句的使用注意事项 如何使用Java1 5出现的foreach语句 foreach在遍历数组 集合方面 fo
  • 【图像分割】实现snake模型的活动轮廓模型以进行图像分割研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 图像分割是计算机视觉领域的一个重要研究方向
  • element中el-table根据状态改变样式,你不能错过的技能

    前言 在开发中 如何根据数据的状态来改变表格的样式一直是一个常见的难题 如果你也曾经为此苦恼过 那么本文将为你介绍如何使用 element 中的 el table 来实现这一目标 让你的数据展示更加直观 易于理解 需求效果 需求 表格中当前
  • 筛选kepler.csv中未下载到的kepid

    In 1 判断输入字符串是否在路径中函数 import os def findfile2 keyword keyword 9d int keyword judgeExist False root os path join C Users 9
  • snapgene设计引物_分子克隆之引物设计(一)

    分子克隆之引物设计 一 目的 将目的基因Homosapiens interleukin 37利用引物扩增表达带上限制酶酶切位点 再与载体pcDNA3 1 3xFlag C酶切连接 师兄给定的酶切位点是 固定 BamH I GGATCC Xh
  • bilibili直播间接收监听和发送弹幕api

    参考文 https blog csdn net fei347795790 article details 111164254 Python实现自动发送B站直播弹幕软件 https blog csdn net fzq13994952987 a
  • 双目相机计算稠密深度点云详解教程

    点击上方 计算机视觉工坊 选择 星标 干货第一时间送达 作者 本文为3D视觉开发者社区特约作者 熊猫飞天授权发布 引言 本教程主要内容为介绍如何使用双目相机计算出稠密的3D点云 主要涉及到elas包的使用 通过KITTI数据集和ZED相机进
  • node生成唯一设备id(node-machine-id)

    npm安装 npm install node machine id yarn安装 yarn add node machine id 有 异步 同步 两种生成方式 import machineId machineIdSync from nod
  • MYSQL

    regexp extract regexp extract str regexp idx str是被解析的字符串或字段名 regexp 是正则表达式 idx是返回结果 取表达式的哪一部分 默认值为1 0表示把整个正则表达式对应的结果全部返回
  • Synchronized锁对象详解

    synchronized 是我们的同步的一种选择 加锁就要有对应的钥匙 这个钥匙分为 当前类对象 当前class对象 第三方对象 synchronized 可以修饰 变量 方法 我们以方法举例可以有如下的几种情况 修饰静态方法 这里默认的锁