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锁对象详解 的相关文章

  • 如何让 BlazeDS 忽略属性?

    我有一个 java 类 它有一个带有 getter 和 setter 的字段 以及第二对 getter 和 setter 它们以另一种方式访问 该字段 public class NullAbleId private static final
  • 在 Java 中克隆对象 [3 个问题]

    这样做会调用Asub的clone方法吗 或者Asub深度克隆是否正确 如果没有的话 有没有办法通过这种方法对Asub进行深度克隆呢 abstract class Top extends TopMost protected Object cl
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 在java中为组合框分配键

    我想添加一个JComboBox在 Swing 中这很简单 但我想为组合中的每个项目分配值 我有以下代码 JComboBox jc1 new JComboBox jc1 addItem a jc1 addItem b jc1 addItem
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 等级保护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 可以修饰 变量 方法 我们以方法举例可以有如下的几种情况 修饰静态方法 这里默认的锁