首页 > 编程语言 >java中的synchronized

java中的synchronized

时间:2024-09-02 17:17:26浏览次数:10  
标签:java synchronized 对象 访问 线程 静态方法 方法

介绍

Java中的synchronized关键字是一种内置的同步机制,用于实现线程之间的互斥,以确保多个线程在同一时刻只能有一个线程访问特定的代码段或对象。synchronized可以用于方法或代码块,从而实现对共享资源的安全访问。

前言

需要明确的是,锁是针对对象而言的,以下场景实际上都是在描述外在表现,内部实现请细究jvm原理。现在,用一句话来概括以下场景,线程只有拿到对象的锁,才能对锁住的代码块进行访问。

使用场景

  1. 修饰具体对象

    • synchronized(this){}
    • synchronized (object){}
    • 在以上两种情况下,锁住的范围是{}之间,需要拿到()中的这个对象的锁,才能访问{}之间的代码体。
    • 由于每一个类都对应着一个Class对象,也可以这么写:synchronized(类名.class) {}
    • 一个有意思的实现
      • 当没有明确的对象,仅仅想让一段代码同步,创建一个节省的对象来充当锁:private byte[] lock = new byte[0];
  2. 成员方法(非静态)

    • 在方法的前面加synchronized 如,public synchronized void
    • 现在,代指当前方法为方法A,在以上情况下,锁住的范围是当前方法的方法体,需要拿到当前对象的锁,才能访问当前对象的方法A。即,成员方法是归属于特定对象的,拿到该对象(或者说实例)的锁,能访问该对象从属的方法A的方法体,但是该类的不同对象而言,访问每个对象里的该方法,都需要当前对象的锁。
  3. 修饰静态方法

    • public synchronized static void method()
    • 静态方法是属于类的而不属于对象的。同样的,当使用 synchronized 修饰静态方法时,锁住的是该类的类对象(Class object),而不是具体的实例对象,这意味着所有该类的静态方法将共享同一个锁,而不管它们是被哪个实例调用的,该实例都要拿到该类的类对象的锁。

后记

待补充jvm知识

参考文章

https://blog.csdn.net/luoweifu/article/details/46613015
https://www.cnblogs.com/lifegoeson/p/13683785.html

标签:java,synchronized,对象,访问,线程,静态方法,方法
From: https://www.cnblogs.com/bbban/p/18393081

相关文章

  • 奥鹏教师教育网刷课脚本-JavaScript编写
    脚本学习网站:奥鹏教师教育网:http://www.ourteacher.com.cn/脚本地址:奥鹏教师教育网-刷课脚本教程1.插件安装(以MicrosoftEdge浏览器为例)打开最中间那个蓝色绿色的浏览器,谷歌之类的浏览器也可以点击屏幕右上角三个点,图示位置,然后点击扩展点击获取扩展搜索Tampermonk......
  • 青海专业技术人员学习网刷课脚本-JavaScript编写
    脚本学习网站:青海省专业技术人员继续教育平台:https://qh.ctet.org.cn青海专业技术人员学习网:https://qinghai.qgzjrcw.com.cn脚本地址:青海专业技术人员学习网-刷课脚本教程1.插件安装(以MicrosoftEdge浏览器为例)打开最中间那个蓝色绿色的浏览器,谷歌之类的浏览器也可以......
  • 程序员必备Java八股文合集
    1、Java线程具有五中基本状态(1)新建状态(New): 当线程对象对创建后,即进入了新建状态,如:Threadt=newMyThread();(2)就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不......
  • java集合练习02
    使用ArrayList完成对对象Car{name,price}的各种操作1.add:添加单个元素2.remove:删除指定元素3.contains:查找元素是否存在•4.size:获取元素个数5.isEmpty:判断是否为空6.Clear:清空7.addAll:添加多个元素8.containsAll:查找多个元素是否都存在9.removeAll:删除多个元素1......
  • Java基础(7)- Java代码笔记4
    目录一、面向对象1.面向对象介绍2.类的介绍和定义3.对象的使用4.匿名对象5.面向对象内存图a.一个对像内存图b.两个对象内存图c.两个对象指向同一片空间内存图6.成员变量和局部变量的区别7.MyDate类二、封装1.封装介绍2.private关键字3.get&set方法4.this关键字......
  • Java服务端数据库连接:连接池的资源管理
    Java服务端数据库连接:连接池的资源管理大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java服务端开发中,数据库连接池是管理数据库连接的重要工具,它能有效提高数据库操作的性能和稳定性。然而,连接池的资源管理同样重要,它涉及到连接的创建、使用、回......
  • 山财培训网刷课脚本-JavaScript编写
    脚本学习网站:山财培训网首页-会计培训专家:http://training.sdufe.edu.cn/脚本地址:山财培训网-刷课脚本教程1.插件安装(以MicrosoftEdge浏览器为例)打开最中间那个蓝色绿色的浏览器,谷歌之类的浏览器也可以点击屏幕右上角三个点,图示位置,然后点击扩展点击获取扩展搜索T......
  • 终于整理完了,2024年最新Java八股文
    一、Java并发面试题1、ThreadLocal1.1谈谈你对ThreadLocal的理解?ThreadLocal的作用主要是做数据隔离,填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的。它不是针对程序的全局变量,只是针对当前线程的全局变量。1.2ThreadLocal底层实现原理?Threadlocal内部......
  • 成都继续教育刷课脚本-JavaScript编写
    脚本学习网站:www.cdjxjy.com,www.cdzjjj.com脚本地址:成都继续教育-刷课脚本教程1.插件安装(以MicrosoftEdge浏览器为例)打开最中间那个蓝色绿色的浏览器,谷歌之类的浏览器也可以点击屏幕右上角三个点,图示位置,然后点击扩展点击获取扩展搜索Tampermonkey,并点击获取那个......
  • Java 实现二叉树展平为链表
    Java实现二叉树展平为链表前言问题背景解决方案代码实现代码分析结论使用原地算法(O(1)空间复杂度)将二叉树展平为链表问题描述解决方案代码实现代码分析优化思路结论前言在处理二叉树数据结构时,有时需要将其转换成一种特殊的形态,即链表。这种转换可以简化某些......