- 浏览: 290625 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
msdn19880714:
楼主你是逗逼么,像你这样比较,直接被气死了
不小心被Cglib忽悠了(已纠正错误2009-3-1) -
javacainiaosc:
网上关于coherence的资料太少了,刚刚入手学习,感谢楼主 ...
Coherence企业级缓存(一) 特点 -
108439162:
不得不说,可能博主自己觉得这样做很牛逼了。但是你忘了依赖注入的 ...
我的开发经验分享(一)-Spring业务bean零配置 -
u010980147:
为什么不告诉我们要导入的包?你做截屏的时候顺道包impor ...
Mule web service调用中的复杂类型传递 -
bigtian:
现在办理社保转移好像没有当年这么麻烦了,国家出台了新的法律了。 ...
作为程序员看社保跨地区转移的问题
Synchronized 同步
Java5开始虽然引入了高效的 Concurrent 并发包,但同步 synchroize 在一些场合还是需要使用的。
比较典型和我们通常的做法是对某个类成员变量加同步锁,这个变量一般是存储关键数据的。
但许多开源框架中有下面的用法, 例如:
Cglib 中的 MethodProxy :
大家不用关心MethodProxy 是做什么的,只需关注 private final Object initLock = new Object();
其中,initLock 对象不用来存储数据,而仅仅用来做同步锁对象,这样可以较小锁的粒度,非常高效。
因此, synchronized(this), synchroniezd( 存储用成员变量) 都可以替换为这个模式。
JDK 源码中也有很多这样的模式的范例可以参考。
应该要加 static的 因为也要保证这个同步锁(一个共享的对象)是同一个锁!
单例不要用懒惰,也不要用双检锁,累赘,罗嗦
http://www.ibm.com/developerworks/cn/java/j-dcl.html
一般定义一个类的私有变量来实现同步,这样可以避免同时锁住类
我也觉得没本质区别
你仔细看完这篇文章的话就知道java1.5之后double check locking是没有问题的
锁定的不是这个类,是这个类当前的对象。
怪我说法不科学。。
静态方法上加synchronized 锁定该类。
实例方法上加synchronized 锁定该实例。
对不起,我想在罗嗦一下,虽然我们都了解其意思,但是有必要对概率进行澄清。
“静态方法上加synchronized 锁定该类。”这句话有待探讨,类是个静态的概念,程序运行起来后没有类,只有对象。 所以这种情况到底锁的是哪个对象,还真不太好表述。就是运行时的 ClassName.class 或 object.getClass() 这个对象吧.
不会有所谓的“双检锁”问题吗?
有的人又说java虚拟可以处理了双检锁问题了,疑惑中……
还有锁的粒度跟小的你信不信?
ls的来一个例子让大家看看
还有锁的粒度跟小的你信不信?
public class MethodProxy
{
private int i,j;
private final Object initLocki = new Object();
private final Object initLockj = new Object();
public void addi()
{
synchronized (initLocki)
{
i++;
}
}
public void subi()
{
synchronized (initLocki)
{
i--;
}
}
public void addj()
{
synchronized (initLockj)
{
j++;
}
}
public void subj()
{
synchronized (initLockj)
{
j--;
}
}
}
不知道这么举例理解合不合适,我想应用场合大约是这样
i与j的操作是两个互不相关的操作,若加同一对象锁或this,就会出现i与j操作的互斥,性能会有不必要的损失
仅仅对同一操作addi、subi及addj、subj加同一对象锁,这样既不存在隐患,且能提高性能
太有才了,通俗易懂的说明了问题,很适合做培训和写技术文章啊,呵呵。
自己的举例能力,真是汗颜,向你学习。
public class MethodProxy
{
private int i,j;
private final Object initLocki = new Object();
private final Object initLockj = new Object();
public void addi()
{
synchronized (initLocki)
{
i++;
}
}
public void subi()
{
synchronized (initLocki)
{
i--;
}
}
public void addj()
{
synchronized (initLockj)
{
j++;
}
}
public void subj()
{
synchronized (initLockj)
{
j--;
}
}
}
不知道这么举例理解合不合适,我想应用场合大约是这样
i与j的操作是两个互不相关的操作,若加同一对象锁或this,就会出现i与j操作的互斥,性能会有不必要的损失
仅仅对同一操作addi、subi及addj、subj加同一对象锁,这样既不存在隐患,且能提高性能
Java5开始虽然引入了高效的 Concurrent 并发包,但同步 synchroize 在一些场合还是需要使用的。
比较典型和我们通常的做法是对某个类成员变量加同步锁,这个变量一般是存储关键数据的。
但许多开源框架中有下面的用法, 例如:
Cglib 中的 MethodProxy :
package net.sf.cglib.proxy; public class MethodProxy { private Signature sig1; private Signature sig2; private final Object initLock = new Object(); private void init() { if (fastClassInfo == null) { synchronized (initLock) { if (fastClassInfo == null) { CreateInfo ci = createInfo; FastClassInfo fci = new FastClassInfo(); ................. fastClassInfo = fci; } } } }
大家不用关心MethodProxy 是做什么的,只需关注 private final Object initLock = new Object();
其中,initLock 对象不用来存储数据,而仅仅用来做同步锁对象,这样可以较小锁的粒度,非常高效。
因此, synchronized(this), synchroniezd( 存储用成员变量) 都可以替换为这个模式。
JDK 源码中也有很多这样的模式的范例可以参考。
评论
35 楼
pengjunwu
2010-09-07
zli.ray 写道
lz的 lock对象,我用普通的
来代替可以吗?
private static Object lock = new Object();
来代替可以吗?
应该要加 static的 因为也要保证这个同步锁(一个共享的对象)是同一个锁!
34 楼
狂放不羁
2010-05-04
不加synchroinzed不能保证可见性,有可能引用是最新的值,但是对象不是。因此需要Voliate来保证内存可见性。
33 楼
tomspiders
2010-05-02
单例不要用懒惰,也不要用双检锁,累赘,罗嗦
http://www.ibm.com/developerworks/cn/java/j-dcl.html
32 楼
mic_scofield
2010-04-19
超级潜水艇 写道
用单独的锁对象是要比锁整个类性能要高出很多。
平常大家直接用在方法上的synchronized 实际上是锁定这个类。
那么不相关业务的锁定都同时锁定该类的话,那么有可能有这样的情景,即两个业务互不相干的,但是却要相互同步(因为方法上都用了synchronized )
平常大家直接用在方法上的synchronized 实际上是锁定这个类。
那么不相关业务的锁定都同时锁定该类的话,那么有可能有这样的情景,即两个业务互不相干的,但是却要相互同步(因为方法上都用了synchronized )
一般定义一个类的私有变量来实现同步,这样可以避免同时锁住类
31 楼
jayming
2010-03-30
dennis_zane 写道
扯淡帖,不存储数据就变成锁粒度更小了?synchronized(this)跟你专门搞个object来用没有本质区别,都是对象锁。
我也觉得没本质区别
30 楼
linkerlin
2010-03-30
Double-checked locking 的传统写法没有volatile修饰。
29 楼
linkerlin
2010-03-30
即使是java 1.5也是要用volatile的。
28 楼
wkoffee
2010-03-30
linkerlin 写道
double lock在java里是失效的。
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
你仔细看完这篇文章的话就知道java1.5之后double check locking是没有问题的
27 楼
dennis_zane
2010-03-30
扯淡帖,不存储数据就变成锁粒度更小了?synchronized(this)跟你专门搞个object来用没有本质区别,都是对象锁。
26 楼
linkerlin
2010-03-30
double lock在java里是失效的。
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
25 楼
linkerlin
2010-03-30
千万不要锁this.
24 楼
nishizhutoua
2010-03-30
很明确的说一句,双锁机制也不是完全可靠.
23 楼
Mybeautiful
2010-03-28
超级潜水艇 写道
Mybeautiful 写道
超级潜水艇 写道
。。。。。。
平常大家直接用在方法上的synchronized 实际上是锁定这个类。 )
平常大家直接用在方法上的synchronized 实际上是锁定这个类。 )
锁定的不是这个类,是这个类当前的对象。
怪我说法不科学。。
静态方法上加synchronized 锁定该类。
实例方法上加synchronized 锁定该实例。
对不起,我想在罗嗦一下,虽然我们都了解其意思,但是有必要对概率进行澄清。
“静态方法上加synchronized 锁定该类。”这句话有待探讨,类是个静态的概念,程序运行起来后没有类,只有对象。 所以这种情况到底锁的是哪个对象,还真不太好表述。就是运行时的 ClassName.class 或 object.getClass() 这个对象吧.
22 楼
徐风子
2010-02-02
raymond2006k 写道
if (fastClassInfo == null) { synchronized (initLock) { if (fastClassInfo == null) { CreateInfo ci = createInfo; FastClassInfo fci = new FastClassInfo(); ................. fastClassInfo = fci; } } }
不会有所谓的“双检锁”问题吗?
有的人又说java虚拟可以处理了双检锁问题了,疑惑中……
21 楼
lzyzizi
2010-02-01
加一个object只是多一个信号量而已,如果你有很多信号量这样实现会很不方便,我记得conurrent包里可以使用condition接口来实现你这种情况。
感觉这个代码都是concurrent包出来之前写的, tomcat中也有类似代码。因为一个monitor不够用。
感觉这个代码都是concurrent包出来之前写的, tomcat中也有类似代码。因为一个monitor不够用。
20 楼
readymydream
2010-02-01
neptune 写道
hommy8 写道
这里重点不在双锁机制,而是锁的粒度...的确应该如LZ说的,锁的粒度达到了最小化了
还有锁的粒度跟小的你信不信?
ls的来一个例子让大家看看
19 楼
neptune
2010-02-01
hommy8 写道
这里重点不在双锁机制,而是锁的粒度...的确应该如LZ说的,锁的粒度达到了最小化了
还有锁的粒度跟小的你信不信?
18 楼
raymond2006k
2010-02-01
runshine 写道
vlinux 写道
能提供一下如何使用这个Reference呢?我乍看一下不明白使用场合呢
public class MethodProxy
{
private int i,j;
private final Object initLocki = new Object();
private final Object initLockj = new Object();
public void addi()
{
synchronized (initLocki)
{
i++;
}
}
public void subi()
{
synchronized (initLocki)
{
i--;
}
}
public void addj()
{
synchronized (initLockj)
{
j++;
}
}
public void subj()
{
synchronized (initLockj)
{
j--;
}
}
}
不知道这么举例理解合不合适,我想应用场合大约是这样
i与j的操作是两个互不相关的操作,若加同一对象锁或this,就会出现i与j操作的互斥,性能会有不必要的损失
仅仅对同一操作addi、subi及addj、subj加同一对象锁,这样既不存在隐患,且能提高性能
太有才了,通俗易懂的说明了问题,很适合做培训和写技术文章啊,呵呵。
自己的举例能力,真是汗颜,向你学习。
17 楼
runshine
2010-02-01
vlinux 写道
能提供一下如何使用这个Reference呢?我乍看一下不明白使用场合呢
public class MethodProxy
{
private int i,j;
private final Object initLocki = new Object();
private final Object initLockj = new Object();
public void addi()
{
synchronized (initLocki)
{
i++;
}
}
public void subi()
{
synchronized (initLocki)
{
i--;
}
}
public void addj()
{
synchronized (initLockj)
{
j++;
}
}
public void subj()
{
synchronized (initLockj)
{
j--;
}
}
}
不知道这么举例理解合不合适,我想应用场合大约是这样
i与j的操作是两个互不相关的操作,若加同一对象锁或this,就会出现i与j操作的互斥,性能会有不必要的损失
仅仅对同一操作addi、subi及addj、subj加同一对象锁,这样既不存在隐患,且能提高性能
16 楼
hommy8
2010-02-01
这里重点不在双锁机制,而是锁的粒度...的确应该如LZ说的,锁的粒度达到了最小化了
发表评论
-
Velocity常见问题
2011-02-09 11:31 01. foreach循环里set临 时变量碰到null的问题 ... -
Web安全纪要
2011-01-25 17:05 01.HttpOnly Using Java to Set H ... -
Eclipse 插件开发技巧
2010-12-19 13:42 01. 菜单和toolbar <action ... -
InfoQ刚发表一篇论文《半静态语言–原理和价值分析》
2010-12-11 22:38 1817半静态语言 – 背景、原理和价值 (Semi-Static L ... -
Xml 的两类应用场景
2010-11-16 09:24 2268Xml 有两类应用场景 1 解析配置文件 这类场景侧重满 ... -
对敏捷的一点看法
2010-10-22 10:50 147810月14日敏捷中国2010 ... -
Apache项目提交流程
2010-08-21 09:47 0要将自己的项目提交给A ... -
Java应用性能问题技巧
2010-07-28 14:38 01. XML 解析时,会到 jar/META-INF/ 下去找 ... -
maven archetype 创建
2010-07-15 09:40 01. 创建一个 archetype 项目 mvn arche ... -
ConcurrentTest并发测试框架介绍
2010-07-10 23:58 1851ConcurrentTest Sourceforge Li ... -
使用Eclipse WTP进行快速Web开发(3)- 开发演示
2010-06-09 13:08 6332使用Eclipse WTP进行快速Web开发(3) 在前 ... -
使用Eclipse WTP进行快速Web开发(2)-准备演示项目
2010-06-08 18:19 4217目前,很多项目基于 maven 进行开发,构建和发布。 而 ... -
使用Eclipse WTP进行快速Web开发(1) - 配置Tomcat
2010-06-08 18:18 8606使用Eclipse WTP进行快速We ... -
使用Eclipse WTP进行快速Web开发
2010-06-08 17:38 0使用Eclipse WTP进行快速Web开发 -
WebBeans 规范适合我们吗?
2010-02-28 21:23 1454JavaEE6 规范已经正式获得通过了,其中一个亮点就是 ... -
认识WebBean ---- 定义
2010-02-16 13:07 3649Gavin King在开发 Seam ... -
YY一下今年技术上想做的事情
2010-01-30 14:15 2783去年下半年除了基 ... -
key-value 型数据库
2010-01-03 22:54 0key-value 型数据库 Tokyo Tyrant Li ... -
HSql的schema
2010-01-03 16:33 1315前段时间被HSql的Schema问题搞的头大。今天梳理一下 ... -
Bean copy性能对比
2009-10-18 00:43 0thread = 1, repeat = 100 TimedT ...
相关推荐
对Java语言的每个语法都提供了一个或多个例程讲解 大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 ...
对Java语言的每个语法都提供了一个或多个例程讲解 大量使用流程图表示程序的执行过程,使用结构图表示程序的内部状态 每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 ...
电子书相关:包含4个有关JAVA线程的电子书(几乎涵盖全部有关线程的书籍) OReilly.Java.Threads.3rd.Edition.Sep.2004.eBook-DDU Java Thread Programming (Sams) java线程第二版中英文 java线程第二版中英文 ...
搭建一个java的开发环境.mp4 │ Java面试题04.java中int占几个字节.mp4 │ Java面试题05.java面向对象的特征.mp4 │ Java面试题06.装箱和拆箱.mp4 │ Java面试题07.==和equals的区别.mp4 │ Java面试题08.String.mp4...
无论是工作学习,不断的总结是必不可少的。只有不断的总结,发现问题,弥补...Java锁小结 321 java.util.concurrent.locks包下常用的类 326 NIO(New IO) 327 volatile详解 337 Java 8新特性 347 Java 性能优化 362
java为数据结构中的列表定义了一个接口类java.util.list同时提供了3个实现类,分别是ArrayList、Vector、LinkedList使用; 生成不重复的随机数序列;列表、集合与数组的互相转换;java为数据结构中的映射定义一个接口...
主要介绍了java线程同步操作,结合实例形式分析了Java线程同步与锁机制相关原理、操作技巧与注意事项,需要的朋友可以参考下
1.5 第一个Java程序 12 1.5.1 编辑Java源代码 12 1.5.2 编译Java程序 13 学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不...
01_先来看一个互联网java工程师的招聘JD 02_互联网Java工程师面试突击训练课程第一季的内容说明 03_关于互联网Java工程师面试突击训练课程的几点说明 04_体验一下面试官对于消息队列的7个连环炮 05_知其然而知其...
而在多线程编程方面,宝典系统地介绍了Java中线程的创建、同步、锁机制等重要知识点,帮助读者理解并掌握多线程编程的技巧。 针对数据库相关知识进行了详细的介绍,包括SQL语法、常用数据库管理系统(如MySQL、...
第一部分从宏观的角度介绍了整个Java技术体系、Java和JVM的发展历程、模块化,以及JDK的编译,这对理解本书后面内容有重要帮助。第二部分讲解了JVM的自动内存管理,包括虚拟机内存区域的划分原理以及各种内存溢出...
实例014 使当前项目依赖另一个项目 21 1.3 界面设计器 22 实例015 安装界面设计器 22 实例016 设计Windows系统的运行对话框 界面 23 实例017 设计计算器程序界面 26 实例018 设计关于进销存管理系统的界面 27 第2章 ...
主要介绍了Java 线程的生命周期,结合完整实例形式分析了java线程周期相关的加锁、释放锁、阻塞、同步等原理与操作技巧,需要的朋友可以参考下
当保护同一个不变性条件中的所有变量时,要使用同一个锁。 在执行复合操作期间,要持有锁。 如果从多个线程中访问同一个可变变量时没有同步机制,那么程序会出现问题。 不要故作聪明地推断出不需要使用同步。 在设计...