A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李东城 中级黑马   /  2013-2-7 03:49  /  2020 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

同步里面常用的锁有三个,this锁、Object锁和当前类.class锁。请问这三个锁的区别及应用场景!

5 个回复

倒序浏览
非静态同步函数的锁为 this锁  
静态同步函数的锁为 该类对应的字节码文件对象的锁  即 当前类.class锁
Object锁 同步代码快是指定的 ,也可以指定别的对象的锁 ,只要是一个对象就可以 。
其中静态同步函数与其他两个有些不同, 就是静态类同步函数随着类的加载而加载,此时还没有本类的对像 但又已该类对应的字节码文件对象 所以 静态同步函数的锁为 该类对应的字节码文件对象的锁

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
同步的前提就是多线程以及同一把锁。只要保证了这个,就可以任意使用锁,只要保证锁是相同的,就可以!对于this锁,对应的是对象,只要使用this锁,一般都是在一个类里面的非静态方法中使用。Object锁的话,使用范围没什么限定,自己定义一个Object对象即可。而当前类.class,这个用的是字节码文件,而每个类对应的字节码文件只有一个,所以可以用到任何可以调用该字节码文件的地方即可!

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
当多线程程序中出现有共享数据的代码时,就要用到同步锁。锁一个对像,而且必须是同一个对象,否则线程不同步。Object是所有类的父类,new一个Object对象也可以当锁。this代表本类对象,所以也是同一个锁。当前类.class是当前类的字节码文件对象。静态函数中,因为对象还没有加载,这时可以用当前类.class作为锁,因为每个类的字节码文件是唯一的。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
对于此问题,你不能单纯的去记住各个锁是什么含义,你要明白到底为什么会有这样的锁,
只有这样你才能真正的去理解并应用它!

1、“锁”出现的原因
当多线程出现时,就出现了当多个线程同时访问同一个数据时就会出现数据安全问题,
为了保证程序的正确运行,这就就引出了“锁”的机制;

2、对于“锁”的理解
其实“锁”就是程序使用的一种安全机制,当对某一数据上了锁后,如果一个线程或的了该锁,
别的线程就无法访问此数据,这就保证了数据的安全;

3、锁的细分
其实无论什么锁都一样,只是具体的习惯使用的场合不一样才导致了你感觉它们有区别!

首先在同步代码块时我们经常提到“object”锁,其实它就是任意一个对象而已--只要随便的
一个对象就可以完成同步代码块的建立。

其次如果在一个类中我们常用的锁是“this”,之所以这样用就是直接用本类的对象比较方便而已,
其实你这时随便定义一个对象用“Object”锁还一样。

最后,“class”锁是用在静态同步函数中的,此时不是不用对象只是没有对象可用而已,因为静态代码
随着类的加载而加载,此时只有“class”可用而已。

其实,如果想用,不管什么地方,“class”锁保证都可以用!

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
同步的锁不是固定的,只要能保证锁的唯一性,就可以实现同步。this  锁 :应用于同步方法   ,类.class锁:应用于静态同步方法 , 同步代码块的锁可以是任意唯一的对象。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马