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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小黑马 黑马帝   /  2012-9-12 16:17  /  1930 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 马小龙 于 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是什么?最好能详细说一说.

评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
函数需要被对象调用。那么函数都有一个所属对象引用,就是this。所以同步函数使用的锁是this。
静态的同步方法,使用的锁是该方法所在类的字节码文件对象,也就是类名.class。

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报
这个有口诀的类 或者是静态方法锁对象是class 而方法对象锁是this

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 新手鼓励!

查看全部评分

回复 使用道具 举报
同步代码块中加一个锁是类实例化对象
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实例



评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼上还详细
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马