synchronized(this)和synchronized(.class)的理解

news/2024/11/30 18:54:56/

synchronized(this)和synchronized(.class)的理解

  • synchronized(this)
    • 验证:
      • 同一对象的Thread(苇名一心):
      • 不同对象的Thread(苇名一心和苇名弦一郎)
  • synchronized( .class)
    • 验证:

对象锁(this)和类锁(class)产生的效果不同,对象锁只对当前对象加锁,而类锁是对指定类加锁。
举个例子:
class person implements Runnable,其中run方法是循环释放巴之雷。假设在释放巴之雷上加锁.
person 苇名一心 = new person();
person 苇名弦一郎 = new person();

实例化出苇名一心和苇名弦一郎两个对象来创建Thread

如果用synchronized(苇名一心),表示对苇名一心这个对象加了锁,这时,苇名一心只能等一个巴之雷放完再放另一个巴之雷(同步),不能同时放好几个巴之雷。但锁的是苇名一心,苇名弦一郎就不会被这个对象锁制约,他就可以和苇名一心同时放巴之雷。
如果用synchronized(person),表示对person这个类加了锁,而苇名一心和苇名弦一郎都是person这个类的对象,那么两人只要有一个在放巴之雷,person类中放巴之雷这个过程就会被锁住,只有等一个巴之雷放完,下一个巴之雷才能继续放。

synchronized(this)

synchronized(this)锁的是当前对象,this代表了对象锁,此时被synchronized锁住的代码块只在当前对象同步,如果有其他对象就不会同步了。

验证:

用Person类来实现Runnable接口。让它来实现释放100次巴之雷。


//测试this
class Person implements Runnable
{public void run() {synchronized (this) {for(int i = 0; i <= 100; i++){try {Thread.sleep(200);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(Thread.currentThread().getName()+"放巴之雷");}	}}
}

同一对象的Thread(苇名一心):


public class Test1 {public static void main(String[] args) {Person you = new Person();//同一对象new出来的thread,受this锁会同步Thread you1 = new Thread(you, "苇名一心1");Thread you2 = new Thread(you,"苇名一心2");		you1.start();you2.start();}
}

输出结果:苇名一心1和苇名一心2不能同时放100次巴之雷,只有一个放完第二个才能放。

在这里插入图片描述
在这里插入图片描述
查看输出结果可以看到同一对象创建出来的Thread是一个线程被锁住的代码块执行完后,才执行另一个线程被锁住的代码块,实现了同步。

不同对象的Thread(苇名一心和苇名弦一郎)

由于this锁是锁住的当前对象,对于用不同对象new出来的Thread,不会受this锁的影响,也就不会实现同步。

public class Test1 {public static void main(String[] args) {Person you = new Person();Person he = new Person();不同对象new出来的thread,不会同步Thread you1 = new Thread(you, "苇名一心");Thread he1 = new Thread(he,"苇名弦一郎");you1.start();he1.start();}}

结果:
在这里插入图片描述

可以看到you1和he1两个线程同时执行,并没有被同步。

synchronized( .class)

.class是一个类锁,对整个类进行加锁。在this的基础上还可以对同一类的不同对象进行同步。


//测试this
class Person implements Runnable
{public void run() {synchronized (Person.class) {for(int i = 0; i <= 100; i++){try {Thread.sleep(200);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(Thread.currentThread().getName()+"放巴之雷");}	}}
}

验证:

public class Test1 {public static void main(String[] args) {Person you = new Person();Person he = new Person();//不同对象,在类锁下会同步。Thread you1 = new Thread(you, "苇名一心");Thread he1 = new Thread(he,"苇名弦一郎");you1.start();he1.start();}}

多次测试后发现可以实现同步。


http://www.ppmy.cn/news/757874.html

相关文章

Hive 1

简介 hive是使用SQL完成大数据统计分析的工具。 hive是facebook公司开源的工具&#xff0c;用来解决海量的结构化日志的统计问题。 hive是构建在hadoop之上的数据仓库。 HDFS: hive的 数据是放在HDFS (distributed storge)&#xff0c; 元数据(metadata)存在对应的底层关系型…

python第三方库pygame的使用

作用&#xff1a;pygame一般用来做游戏 注意&#xff1a;1.在使用pygame提供的功能之前&#xff0c;需要调用init方法 2.在游戏结束前需要调用 quit 方法 pygame中的各个函数&#xff1a; 1.pygame.init()&#xff1a;该函数在使用pygame时进行初始化&#xff0c;只有引用了该…

BUU[SCTF2019]Who is he

unity 用dnspy打开Assembly-CSharp.dll&#xff0c;分析主要加密 分析加密函数&#xff0c;DES加密&#xff08;key和vi一样&#xff09;&#xff0c;和Base64 根据已知数据解密 &#xff0c;但是在C#中&#xff0c;字符串默认是Unicode字符串&#xff0c;所以转成字节数组&am…

Qt自定义控件-坐标原点位置变化

1、qt界面默认绘制坐标是从左上角为原点进行绘制的&#xff0c;如下图所示&#xff1a; 2、重新设置原点位置 利用painter.translate函数将原点位置控制到指定位置 例如&#xff1a;先绘制一个矩形&#xff0c;然后将矩形的中心点作为原点再画直线 void paintEvent(QPaintEve…

ROS:工作空间覆盖

目录 一、概念二、示例2.1操作2.2原因 三、存在的问题 一、概念 所谓工作空间覆盖&#xff0c;是指不同工作空间中&#xff0c;存在重名的功能包的情形。 ROS 开发中&#xff0c;会自定义工作空间且自定义工作空间可以同时存在多个&#xff0c;可能会出现一种情况: 虽然特定工…

解决Github下载速度慢的问题

分享两款github加速插件来解决Github资源下载速度慢的问题。 这两款脚本使用方法相同&#xff0c;都需要使用脚本管理工具来运行&#xff0c;首先要给你的浏览器安装Tampermonkey&#xff08;油猴脚本管理器&#xff09;&#xff0c;安装油候脚本管理器后&#xff0c;直接打开这…

git官网下载太慢解决方法

下载传送门 https://npm.taobao.org/mirrors/git-for-windows/ 选择版本 进入后&#xff0c;选择你想要的版本&#xff0c;它里面是 降序排序。 我想下载新版本怎么做&#xff1f;&#xff1a;拉到最底部&#xff0c;如下图所示&#xff1a; 2. 我想下载旧版本怎么做&#…

git下载速度慢解决方案汇总(git慢,亲测第二种方法简单贼快)

如果是文件本身过大的话&#xff0c;可以考虑使用: 一. 使用git shallow clone来下载 git clone https://github.com/xxx --depth 1 cd xxx git fetch --unshallow 解释一下这两条命令: git clone --depth 1 本身会让clone下来的是最近的一个commit的文件夹状态&#xff0c…