黑马程序员技术交流社区

标题: 同步锁的疑问 [打印本页]

作者: 李东城    时间: 2013-2-7 03:49
标题: 同步锁的疑问
同步里面常用的锁有三个,this锁、Object锁和当前类.class锁。请问这三个锁的区别及应用场景!

作者: 刘凯    时间: 2013-2-7 09:53
非静态同步函数的锁为 this锁  
静态同步函数的锁为 该类对应的字节码文件对象的锁  即 当前类.class锁
Object锁 同步代码快是指定的 ,也可以指定别的对象的锁 ,只要是一个对象就可以 。
其中静态同步函数与其他两个有些不同, 就是静态类同步函数随着类的加载而加载,此时还没有本类的对像 但又已该类对应的字节码文件对象 所以 静态同步函数的锁为 该类对应的字节码文件对象的锁
作者: 黄成超    时间: 2013-2-7 22:20
同步的前提就是多线程以及同一把锁。只要保证了这个,就可以任意使用锁,只要保证锁是相同的,就可以!对于this锁,对应的是对象,只要使用this锁,一般都是在一个类里面的非静态方法中使用。Object锁的话,使用范围没什么限定,自己定义一个Object对象即可。而当前类.class,这个用的是字节码文件,而每个类对应的字节码文件只有一个,所以可以用到任何可以调用该字节码文件的地方即可!
作者: HM王琦    时间: 2013-2-7 23:36
当多线程程序中出现有共享数据的代码时,就要用到同步锁。锁一个对像,而且必须是同一个对象,否则线程不同步。Object是所有类的父类,new一个Object对象也可以当锁。this代表本类对象,所以也是同一个锁。当前类.class是当前类的字节码文件对象。静态函数中,因为对象还没有加载,这时可以用当前类.class作为锁,因为每个类的字节码文件是唯一的。
作者: 李大强    时间: 2013-2-8 17:54
对于此问题,你不能单纯的去记住各个锁是什么含义,你要明白到底为什么会有这样的锁,
只有这样你才能真正的去理解并应用它!

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

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

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

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

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

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

其实,如果想用,不管什么地方,“class”锁保证都可以用!
作者: 花伟昌    时间: 2013-4-12 21:36
同步的锁不是固定的,只要能保证锁的唯一性,就可以实现同步。this  锁 :应用于同步方法   ,类.class锁:应用于静态同步方法 , 同步代码块的锁可以是任意唯一的对象。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2