黑马程序员技术交流社区

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

作者: 小黑马    时间: 2012-9-12 16:17
标题: synchronized同步锁问题
本帖最后由 马小龙 于 2012-9-12 21:35 编辑

同步代码块中加一个锁是类实例化对象
Object obj = new Object();
sychronized( obj  ){
      //执行代码
}
在视屏中同步方法中说加的锁是 this
public sychronized void add(){
     //执行代码
}
还有单例模式中,加的一个锁是 Single.class的字节码
  1. class Single{
  2.                    private static Single s = null;   // 先建立一个引用变量,但是延迟建立类、
  3.                    private Single(){}
  4.                    public static Single getInstance(){
  5.                              if(s==null){
  6.                                        synchronized(Single.class){  //加锁后避免出现建立多个对象
  7.                                                   if(s==null)
  8.                                                           s=new Single();           //延迟在这个地方建立对象
  9.                                        }
  10.                              }
  11.                              return s;
  12.                   }
  13.          }
复制代码
问题1:第一个中加的是一个实例化对象, 方法中加的是this,是不是可以理解成加的锁是调用this的那个实例化对象?
问题2:后面单例模式中加的是Single类的字节码,那和前面加的锁是一样的吗?还是只是加载一段字节码就行?
问题3:String.class是什么?最好能详细说一说.

作者: 李菁    时间: 2012-9-12 16:36
函数需要被对象调用。那么函数都有一个所属对象引用,就是this。所以同步函数使用的锁是this。
静态的同步方法,使用的锁是该方法所在类的字节码文件对象,也就是类名.class。
作者: 尤圣回    时间: 2012-9-12 17:51
这个有口诀的类 或者是静态方法锁对象是class 而方法对象锁是this
作者: Tesla时光    时间: 2012-9-12 19:38
同步代码块中加一个锁是类实例化对象
Object obj = new Object();
sychronized( obj  ){
      //执行代码
}
在视屏中同步方法中说加的锁是 this
public sychronized void add(){
     //执行代码
}
还有单例模式中,加的一个锁是 Single.class的字节码
复制代码
问题1:第一个中加的是一个实例化对象, 方法中加的是this,是不是可以理解成加的锁是调用this的那个实例化对象?
没错,就是这样理解.其实你想下生产者和消费者那个事例,我们在代码上同步加锁时用的是对象,如果要表示和方法用同一把锁,就要用this.\

问题2:后面单例模式中加的是Single类的字节码,那和前面加的锁是一样的吗?还是只是加载一段字节码就行?
这个可以理解成功能一样,但作用范围不一样.
同步加锁在方法上,表示对整个方法有效,这个方法,每次只能有一个线程在调用
而加在一段代码上,表示这段代码每次只能有一个线程在运行.

问题3:String.class是什么?最好能详细说一说.
String.class是获取ConfMgr的class对象
类名.class是Class对象的句柄,每个被加载的类,在jvm中都会有一个Class对象与之相对应,如果要创建新的对象,直接使用Class对象的局部class.forName就可以了,不需要用new+ 类名。
在java中,每个class都有一个相应的Class对象,当编写好一个类,编译完成后,在生成的.class文件中,就产生一个class对象,用来表示这个类的类型信息。获得Class实例的三中方式:
1.利用对象调用getClass()方法获取该对象的Class实例
2.使用Class的静态方法forName(),用类的名字获取一个Class实例
3.运用.calss的方式获取Class实例,对基本数据类型的封装类,还可以采用.TYPE来获取对应的基本数据类型的Class实例




作者: 王金科    时间: 2012-9-12 21:08
楼上还详细




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