Java 中的类锁和对象锁
2016-07-22 10:57
537 查看
类锁:在方法上加上static synchronized的锁,或者synchronized(xxx.class)的锁。
对象锁:就是锁是Java对象。
举例:
public class LockDemo {
private Object object = new Object();
public synchronized void method_01(){}
public void method_02(){
synchronized (this.object) {}
}
public void method_03(){
synchronized (this) {}
}
public void method_04(){
synchronized (LockDemo.class) {}
}
public static synchronized void method_05(){}
}
从上面可以得出:method_01和method_04是类锁,其它三个是对象锁。
做一道题:
有一个类,如下:
public class SynchronizedTest
{ public synchronized void method1(){}
public synchronized void method2(){}
public static synchronized void method3(){}
public static synchronized void method4(){}
}那么,有SynchronizedTest的两个实例a和b,对于一下的几个选项有哪些能被一个以上的线程同时访问呢?
A. a.method1() vs. a.method2()
B. a.method1() vs. b.method1()
C. a.method3() vs. b.method4()
D. a.method3() vs. b.method3()
E. a.method1() vs. a.method3()
答案是什么呢?BE
method1和method2都是对象锁,method3和method4都是类锁,A选项中两个方法使用的是一个对象锁,所以不能同时访问;B选项中两个方法使用的是两个对象的对象锁,所以可以同时访问;C、D选项的两个方法都是使用的一个类锁,所以不能同时访问;E选项中的两个方法一个是对象锁,一个是类锁,所以可以同时访问
对象锁:就是锁是Java对象。
举例:
public class LockDemo {
private Object object = new Object();
public synchronized void method_01(){}
public void method_02(){
synchronized (this.object) {}
}
public void method_03(){
synchronized (this) {}
}
public void method_04(){
synchronized (LockDemo.class) {}
}
public static synchronized void method_05(){}
}
从上面可以得出:method_01和method_04是类锁,其它三个是对象锁。
做一道题:
有一个类,如下:
public class SynchronizedTest
{ public synchronized void method1(){}
public synchronized void method2(){}
public static synchronized void method3(){}
public static synchronized void method4(){}
}那么,有SynchronizedTest的两个实例a和b,对于一下的几个选项有哪些能被一个以上的线程同时访问呢?
A. a.method1() vs. a.method2()
B. a.method1() vs. b.method1()
C. a.method3() vs. b.method4()
D. a.method3() vs. b.method3()
E. a.method1() vs. a.method3()
答案是什么呢?BE
method1和method2都是对象锁,method3和method4都是类锁,A选项中两个方法使用的是一个对象锁,所以不能同时访问;B选项中两个方法使用的是两个对象的对象锁,所以可以同时访问;C、D选项的两个方法都是使用的一个类锁,所以不能同时访问;E选项中的两个方法一个是对象锁,一个是类锁,所以可以同时访问
相关文章推荐
- spring-restdocs的研究
- JavaWeb项目自动化部署测试学习
- eclipse加载maven项目初始配置
- Eclipse中添加文档注释快捷键
- Java中五种不同方法的创建对象
- java类集框架
- Lock-----Java 类
- java使用poi读取doc和docx文件
- java抽象类和抽象方法(转载)
- quartz任务调度整合springMVC学习二
- Java多线程基础
- gen already exists but is not a source folder. Convert to a source folder or rename it.
- Java设计模式之代理模式(Proxy)
- eclispe中的maven项目使用spring报java.lang.ClassNotFoundException: org.springframework.web.c
- Java 复制字符串到系统剪贴板(未测试)
- SpringMVC Controller 返回值的可选类型
- java获取本地操作系统进程列表(未测试)
- java 8种基本数据类型的默认值及所占字节数
- Java获得jvm占用的内存和系统的可用内存信息(未测试)
- JAVA设计模式--策略模式