同步代码块中加一个锁是类实例化对象
Object obj = new Object();
sychronized( obj ){
//执行代码
}
在视屏中同步方法中说加的锁是 this
public sychronized void add(){
//执行代码
}
还有单例模式中,加的一个锁是 Single.class的字节码- class Single{
- private static Single s = null; // 先建立一个引用变量,但是延迟建立类、
- private Single(){}
- public static Single getInstance(){
- if(s==null){
- synchronized(Single.class){ //加锁后避免出现建立多个对象
- if(s==null)
- s=new Single(); //延迟在这个地方建立对象
- }
- }
- return s;
- }
- }
复制代码
问题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实例
|