深入Synchronized和java.util.concurrent.locks.Lock的区别详解
转载自 深入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的区别详解相关推荐
- synchronized与java.util.concurrent.locks.Lock的相同之处和不同之处
● 请你简述一下synchronized与java.util.concurrent.locks.Lock的相同之处和不同之处? 考察点:锁机制 参考回答: 主要相同点:Lock能完成synchroni ...
- java.util.concurrent.locks.Lock 接口 源码
2019独角兽企业重金招聘Python工程师标准>>> 相关类图: java.util.concurrent.locks.Lock 源码: package java.util.con ...
- 【JDK源码】java.util.concurrent.atomic包常用类详解
java.util.concurrent.atomic原子操作类包里面提供了一组原子变量类.其基本的特性就是在多线程环境下,当有多个线程同时执行这些类的实例包含的方法时,具有排他性,即当某个线程进入方 ...
- java.util.concurrent.locks.Lock文档说明
[1]Lock接口文档描述 1.相比于使用synchronized方法和代码块,锁的出现提供了更广泛的锁操作. 锁允许更灵活的代码结构,具有许多不同的属性,还支持多个关联的Condition条件对象. ...
- java.util.concurrent.locks.Condition 源码
2019独角兽企业重金招聘Python工程师标准>>> 相关类图: 使用Condition和 object作为条件队列的区别: object: 只能绑定一个内部队列,使用notify ...
- java throw与throws_基于Java中throw和throws的区别(详解)
系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...
- throws java_基于Java中throw和throws的区别(详解)
系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...
- java里throws详细讲解,基于Java中throw和throws的区别(详解)
系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...
- java.util.concurrent.Locks使用指南
1.概述 简而言之,锁是一种比标准同步块更灵活,更复杂的线程同步机制. 自Java 1.5以来,Lock接口一直存在.它在java.util.concurrent.lock包中定义,它提供了大量的锁定 ...
最新文章
- C++向量类模板(支持实数向量与复数向量的各种运算)
- oracle nvl用法
- mysql数据库优化课程---16、mysql慢查询和优化表空间
- datatables 无法 无法重新初始化datatable_伽巫塔罗:2020年9月运势占卜,摩羯没了热情,无法重新卡死...
- java类的结构:构造器 —(13)
- 台达b3伺服参数设置方法_2020东莞清溪台达自动化配件回收厂家直购
- java web输出语句到控制台_Java工程师(6).循环结构
- python中文叫什么-在python中,quot;~”是什么意思?
- 小心投机分子绿坝软件的苦肉计
- 从无线安全到内网渗透
- Android字节码ASM插桩
- PipeCAD 简介
- b ,B,KB,MB,GB之间的关系
- 小程序实现图片双滑放大缩小
- 博图SCL编程——多种情况下的开关阀控制
- 苏嵌//张福辉//2018.7.24
- 【积水成渊-逐步定制自己的Emacs神器】2:基本的定制Emacs
- 不想升级iOS 15系统?iPhone最新屏蔽iOS更新的方法
- Flask+Vue搭建系统
- 这又是啥?[babel-plugin-component] If you are using bothon-demand and importing all, make sure to invoke
热门文章
- 151. 翻转字符串里的单词(思路+详解)
- python中的max_row_Openpyxl max_row和max_column错误地报告了一个较大的figu
- c++ string 删除字符_字符串操作的全面总结(附完整代码)
- 递归算法(一)递归概念与思路
- cookies默认过期时间_「图」Chrome Canary新版已启动“增强版cookies控制”预览测试...
- Codeforces Round #636 (Div. 3) F. Restore the Permutation by Sorted Segments 思维 + 暴力
- Codeforces Round #628 (Div. 2) E. Ehab‘s REAL Number Theory Problem 巧妙的质因子建图
- CF750G New Year and Binary Tree Paths(数位dp二进制+数学)
- CF788789(div1div2)
- P3426-[POI2005]SZA-Template【KMP】