我在看多线程,看了好几本书关于多线程的章节之后,对于用synchronized 加锁有个疑问:如下代码:
class A
{
Integer i; public int getI()
{
return ++i;
}}假如i是临界资源,我们在多线程访问的时候,都知道要同步,那到底该怎么用synchronized 呢
一个说法是直接
public synchronized int getI()
{
return ++i;
}第二种是说把synchronized 加到方法内部,这样:
public int getI()
{
synchronized (i) {
return ++i;
}
}
还有一种是直接把i换成this,如
public int getI()
{
synchronized (this) {
return ++i;
}
}
我知道其实这3种都对吧,但是我不知道什么情况下用第一种好,什么情况下第二种好,什么情况下第三种好,请赐教
class A
{
Integer i; public int getI()
{
return ++i;
}}假如i是临界资源,我们在多线程访问的时候,都知道要同步,那到底该怎么用synchronized 呢
一个说法是直接
public synchronized int getI()
{
return ++i;
}第二种是说把synchronized 加到方法内部,这样:
public int getI()
{
synchronized (i) {
return ++i;
}
}
还有一种是直接把i换成this,如
public int getI()
{
synchronized (this) {
return ++i;
}
}
我知道其实这3种都对吧,但是我不知道什么情况下用第一种好,什么情况下第二种好,什么情况下第三种好,请赐教
解决方案 »
- 想得到一个txt中某行的行号
- 使用ant 执行Junit测试的问题
- 关于读取十六进制文件转换十进制的问题
- 学习java的rmi用什么书好一点啊?
- 请高人解答图片导致界面闪动问题!
- class文件加密问题???
- 请 问 Java 里 面 实 现 一 块 内 存 的 拷 贝 ?
- 『SOS』一个二叉树,重要点在于TreeNode,看有没有能帮个忙,会有加分的—————______________----------大三了,一起学Java
- 还是GUI的问题
- 我的一个应用程序设置了MetalLookAndFeel,但是字体很难看,如何能够统一设置成我要的字体?
- jfreeChart如何去掉X轴最底下文字?
- 乱码问题
并且A只有一个实例的话,上面3个都对的。
如果你明确是要在i上做操作的话当然synchronized i 好
这个就是锁住this对象。
锁住整个函数体,用在里面锁住相应的函数体。