Java对象锁
作者:网络转载 发布时间:[ 2016/12/28 9:55:12 ] 推荐标签:测试开发技术 Java 锁
publicvoidh() {
// other operations should not be locked...
System.out.println(Thread.currentThread().getName()
+":not synchronized in h()");
lock.lock();
try{
for(inti = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()
+":synchronized in h()");
try{
TimeUnit.SECONDS.sleep(3);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}finally{
lock.unlock();
}
}
publicstaticvoidmain(String[] args) {
finalResource3 rs =newResource3();
newThread() {
publicvoidrun() {
rs.f();
}
}.start();
newThread() {
publicvoidrun() {
rs.g();
}
}.start();
rs.h();
}
}
结果:
Thread-0:not synchronized in f()
Thread-0:synchronized in f()
main:not synchronized in h()
Thread-1:not synchronized in g()
Thread-0:synchronized in f()
Thread-0:synchronized in f()
Thread-0:synchronized in f()
Thread-0:synchronized in f()
main:synchronized in h()
main:synchronized in h()
main:synchronized in h()
main:synchronized in h()
main:synchronized in h()
Thread-1:synchronized in g()
Thread-1:synchronized in g()
Thread-1:synchronized in g()
Thread-1:synchronized in g()
Thread-1:synchronized in g()
Resource4.java
packagecom.zj.lock;
importjava.util.concurrent.TimeUnit;
importjava.util.concurrent.locks.Lock;
importjava.util.concurrent.locks.ReentrantLock;
publicclassResource4 {
privateLocklock1=newReentrantLock();
privateLocklock2=newReentrantLock();
privateLocklock3=newReentrantLock();
publicvoidf() {
// other operations should not be locked...
System.out.println(Thread.currentThread().getName()
+":not synchronized in f()");
lock1.lock();
try{
for(inti = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()
+":synchronized in f()");
try{
TimeUnit.SECONDS.sleep(3);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}finally{
lock1.unlock();
}
}
publicvoidg() {
// other operations should not be locked...
System.out.println(Thread.currentThread().getName()
+":not synchronized in g()");
lock2.lock();
try{
for(inti = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()
+":synchronized in g()");
try{
TimeUnit.SECONDS.sleep(3);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}finally{
lock2.unlock();
}
}
publicvoidh() {
// other operations should not be locked...
System.out.println(Thread.currentThread().getName()
+":not synchronized in h()");
lock3.lock();
try{
for(inti = 0; i < 5; i++) {
System.out.println(Thread.currentThread().getName()
+":synchronized in h()");
try{
TimeUnit.SECONDS.sleep(3);
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}finally{
lock3.unlock();
}
}
publicstaticvoidmain(String[] args) {
finalResource4 rs =newResource4();
newThread() {
publicvoidrun() {
rs.f();
}
}.start();
newThread() {
publicvoidrun() {
rs.g();
}
}.start();
rs.h();
}
}
结果:
Thread-0:not synchronized in f()
Thread-0:synchronized in f()
main:not synchronized in h()
main:synchronized in h()
Thread-1:not synchronized in g()
Thread-1:synchronized in g()
Thread-0:synchronized in f()
main:synchronized in h()
Thread-1:synchronized in g()
Thread-0:synchronized in f()
main:synchronized in h()
Thread-1:synchronized in g()
Thread-0:synchronized in f()
main:synchronized in h()
Thread-1:synchronized in g()
Thread-0:synchronized in f()
main:synchronized in h()
Thread-1:synchronized in g()
synchronized和lock的区别:
Lock 的锁定是通过代码实现的,而 synchronized 是在 JVM 层面上实现的
synchronized 在锁定时如果方法块抛出异常,JVM 会自动将锁释放掉,不会因为出了异常没有释放锁造成线程死锁。但是 Lock 的话享受不到 JVM 带来自动的功能,出现异常时必须在 finally 将锁释放掉,否则将会引起死锁。
在资源竞争不是很激烈的情况下,偶尔会有同步的情形下,synchronized是很合适的。原因在于,编译程序通常会尽可能的进行优化synchronize,另外可读性非常好,不管用没用过5.0多线程包的程序员都能理解。
ReentrantLock:
ReentrantLock提供了多样化的同步,比如有时间限制的同步,可以被Interrupt的同步(synchronized的同步是不能Interrupt的)等。在资源竞争不激烈的情形下,性能稍微比synchronized差点点。但是当同步非常激烈的时候,synchronized的性能一下子能下降好几十倍。而ReentrantLock确还能维持常态。
Atomic:
和上面的类似,不激烈情况下,性能比synchronized略逊,而激烈的时候,也能维持常态。激烈的时候,Atomic的性能会优于ReentrantLock一倍左右。但是其有一个缺点,是只能同步一个值,一段代码中只能出现一个Atomic的变量,多于一个同步无效。因为他不能在多个Atomic之间同步。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
Java性能测试有哪些不为众人所知的原则?Java设计模式??装饰者模式谈谈Java中遍历Map的几种方法Java Web入门必知你需要理解的Java反射机制知识总结编写更好的Java单元测试的7个技巧编程常用的几种时间戳转换(java .net 数据库)适合Java开发者学习的Python入门教程Java webdriver如何获取浏览器新窗口中的元素?Java重写与重载(区别与用途)Java变量的分类与初始化JavaScript有这几种测试分类Java有哪四个核心技术?给 Java开发者的10个大数据工具和框架Java中几个常用设计模式汇总java生态圈常用技术框架、开源中间件,系统架构及经典案例等
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南