转载自  深入Synchronized和java.util.concurrent.locks.Lock的区别详解

本篇文章是对Synchronized和java.util.concurrent.locks.Lock的区别进行了详细的分析介绍,需要的朋友参考下

主要相同点:Lock能完成Synchronized所实现的所有功能。
主要不同点:Lock有比Synchronized更精确的线程予以和更好的性能。
Synchronized会自动释放锁,但是Lock一定要求程序员手工释放,并且必须在finally从句中释放。
synchronized 修饰方法时 表示同一个对象在不同的线程中 表现为同步队列
如果实例化不同的对象 那么synchronized就不会出现同步效果了。
1.对象的锁 
所有对象都自动含有单一的锁。 
JVM负责跟踪对象被加锁的次数。如果一个对象被解锁,其计数变为0。在任务(线程)第一次给对象加锁的时候,计数变为1。每当这个相同的任务(线程)在此对象上获得锁时,计数会递增。 
只有首先获得锁的任务(线程)才能继续获取该对象上的多个锁。 
每当任务离开一个synchronized方法,计数递减,当计数为0的时候,锁被完全释放,此时别的任务就可以使用此资源。 
2.synchronized同步块 
2.1同步到单一对象锁 

当使用同步块时,如果方法下的同步块都同步到一个对象上的锁,则所有的任务(线程)只能互斥的进入这些同步块。 
Resource1.java演示了三个线程(包括main线程)试图进入某个类的三个不同的方法的同步块中,虽然这些同步块处在不同的方法中,但由于是同步到同一个对象(当前对象 synchronized (this)),所以对它们的方法依然是互斥的。 
比如

class Test
{public static User user=null;public synchronized void add(User u){user=u;Dao.save(user)}
}

如果在线程1中

Test test=new Test();
User u=new User();
u.setUserName(“liaomin”);
u.setUserPassword(“liaomin”);
Test.add(u);

如果在线程2中

Test tes1t=new Test();
User u1=new User();
u1.setUserName(“huqun”);
u1.setUserPassword(“huqun”);
Tes1t.add(u1);

那么 现在线程1 和线程2同时启动 如果对象new的不是同一个Test
那么出现线程交叉的话 那么插入数据库中的数据就是相同的
因为你的user变量时静态的   你给他赋值第一次 假如还没有save的时候
另外一个线程改变了user的值 那么第一个线程插入时也就是第二次赋予的值了

所以要实现同步 那么可以改方法为静态的就能达到同步的效果了
修改如下

public static synchronized void add(User u)
{user=u;Dao.save(user)
}

修改为static的方法是存在于堆中
是全局方法 针对于所有实例化与未 实例化的对象只存在一个 所以会出现同步队列

当然不用static 也可以 那就用lock

class Test
{
public static User user=null;
Lock lock=new ReentrantLock();Public void add(User u)
{
lock.lock();user=u;Dao.save(user);
lock.unlock();
}
}

这样无论你new多少个对象都会是线程同步的
相当于

public static synchronized void add(User u)
{user=u;Dao.save(user)
}

同时 lock性能上高于synchronized
只是lock需要手动关闭

深入Synchronized和java.util.concurrent.locks.Lock的区别详解相关推荐

  1. synchronized与java.util.concurrent.locks.Lock的相同之处和不同之处

    ● 请你简述一下synchronized与java.util.concurrent.locks.Lock的相同之处和不同之处? 考察点:锁机制 参考回答: 主要相同点:Lock能完成synchroni ...

  2. java.util.concurrent.locks.Lock 接口 源码

    2019独角兽企业重金招聘Python工程师标准>>> 相关类图: java.util.concurrent.locks.Lock 源码: package java.util.con ...

  3. 【JDK源码】java.util.concurrent.atomic包常用类详解

    java.util.concurrent.atomic原子操作类包里面提供了一组原子变量类.其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方 ...

  4. java.util.concurrent.locks.Lock文档说明

    [1]Lock接口文档描述 1.相比于使用synchronized方法和代码块,锁的出现提供了更广泛的锁操作. 锁允许更灵活的代码结构,具有许多不同的属性,还支持多个关联的Condition条件对象. ...

  5. java.util.concurrent.locks.Condition 源码

    2019独角兽企业重金招聘Python工程师标准>>> 相关类图: 使用Condition和 object作为条件队列的区别: object: 只能绑定一个内部队列,使用notify ...

  6. java throw与throws_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  7. throws java_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  8. java里throws详细讲解,基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  9. java.util.concurrent.Locks使用指南

    1.概述 简而言之,锁是一种比标准同步块更灵活,更复杂的线程同步机制. 自Java 1.5以来,Lock接口一直存在.它在java.util.concurrent.lock包中定义,它提供了大量的锁定 ...

最新文章

  1. C++向量类模板(支持实数向量与复数向量的各种运算)
  2. oracle nvl用法
  3. mysql数据库优化课程---16、mysql慢查询和优化表空间
  4. datatables 无法 无法重新初始化datatable_伽巫塔罗:2020年9月运势占卜,摩羯没了热情,无法重新卡死...
  5. java类的结构:构造器 —(13)
  6. 台达b3伺服参数设置方法_2020东莞清溪台达自动化配件回收厂家直购
  7. java web输出语句到控制台_Java工程师(6).循环结构
  8. python中文叫什么-在python中,quot;~”是什么意思?
  9. 小心投机分子绿坝软件的苦肉计
  10. 从无线安全到内网渗透
  11. Android字节码ASM插桩
  12. PipeCAD 简介
  13. b ,B,KB,MB,GB之间的关系
  14. 小程序实现图片双滑放大缩小
  15. 博图SCL编程——多种情况下的开关阀控制
  16. 苏嵌//张福辉//2018.7.24
  17. 【积水成渊-逐步定制自己的Emacs神器】2:基本的定制Emacs
  18. 不想升级iOS 15系统?iPhone最新屏蔽iOS更新的方法
  19. Flask+Vue搭建系统
  20. 这又是啥?[babel-plugin-component] If you are using bothon-demand and importing all, make sure to invoke

热门文章

  1. 151. 翻转字符串里的单词(思路+详解)
  2. python中的max_row_Openpyxl max_row和max_column错误地报告了一个较大的figu
  3. c++ string 删除字符_字符串操作的全面总结(附完整代码)
  4. 递归算法(一)递归概念与思路
  5. cookies默认过期时间_「图」Chrome Canary新版已启动“增强版cookies控制”预览测试...
  6. Codeforces Round #636 (Div. 3) F. Restore the Permutation by Sorted Segments 思维 + 暴力
  7. Codeforces Round #628 (Div. 2) E. Ehab‘s REAL Number Theory Problem 巧妙的质因子建图
  8. CF750G New Year and Binary Tree Paths(数位dp二进制+数学)
  9. CF788789(div1div2)
  10. P3426-[POI2005]SZA-Template【KMP】