相关疑难解决方法(0)

使用同步方法而不是同步块是否有优势?

任何人都可以通过一个例子告诉我同步方法优于synchronized块的优势吗?

java concurrency multithreading locking synchronized

397
推荐指数
13
解决办法
28万
查看次数

避免在Java中同步(this)?

每当有关Java同步的问题出现时,有些人非常渴望指出synchronized(this)应该避免的.相反,他们声称,首选锁定私人参考.

一些给出的原因是:

其他人,包括我在内,认为这synchronized(this)是一个被大量使用的习惯用法(也在Java库中),是安全且易于理解的.它不应该被避免,因为你有一个错误,你不知道多线程程序中发生了什么.换句话说:如果适用,则使用它.

我有兴趣看到一些现实世界的例子(没有foobar的东西)避免锁定this是最好的,当synchronized(this)也做的工作.

因此:您是否应始终避免synchronized(this)并使用私有引用上的锁来替换它?


一些进一步的信息(更新为答案):

  • 我们正在谈论实例同步
  • 考虑隐式(synchronized方法)和显式形式synchronized(this)
  • 如果您引用Bloch或其他有关该主题的权限,请不要遗漏您不喜欢的部分(例如,有效Java,线程安全项目:通常它是实例本身的锁,但也有例外.)
  • 如果你需要锁定的粒度而不是synchronized(this)提供,那么synchronized(this)不适用,所以这不是问题

java multithreading synchronization synchronized

369
推荐指数
9
解决办法
14万
查看次数

Java同步方法锁定对象或方法?

如果我在同一个类中有2个同步方法,但每个方法访问不同的变量,那么2个线程可以同时访问这两个方法吗?锁是否发生在对象上,或者它是否与synchronized方法中的变量一样具体?

例:

class X {

    private int a;
    private int b;

    public synchronized void addA(){
        a++;
    }

    public synchronized void addB(){
        b++;
    }

}
Run Code Online (Sandbox Code Playgroud)

2个线程可以同时访问同一个X类实例x.addA()x.addB()吗?

java multithreading locking synchronized thread-safety

176
推荐指数
6
解决办法
16万
查看次数

java中的"隐式"同步?

当我有一个像这样的方法

public void unsynchronizedMethod(){
  callSynchronizedMethod();
  //dosomestuff after this line
}
Run Code Online (Sandbox Code Playgroud)

是否意味着在调用unsynchronizedMethod() - Method中的callSynchronizedMethod()后,所有内容都是隐式同步的?

java synchronization

3
推荐指数
1
解决办法
757
查看次数

同步函数和同步块之间有什么区别?

有什么区别

public synchronized void addition()
{
   //something;
}
Run Code Online (Sandbox Code Playgroud)

public void addtion()
{
     synchronized (//something)
     {
        //something;
     }
}
Run Code Online (Sandbox Code Playgroud)

如果我错了,请忽略这个问题.

java multithreading locking synchronized

2
推荐指数
1
解决办法
481
查看次数

同步(此)阻止整个对象?

可能重复:
同步块与同步方法?

从对这个问题的公认答案:在Java关键部分中,应该同步什么? 我了解到

public synchronized void foo() {
    // do something thread-safe
}
Run Code Online (Sandbox Code Playgroud)

和:

public void foo() {
    synchronized (this) {
        // do something thread-safe
    }
}
Run Code Online (Sandbox Code Playgroud)

做完全一样的事情。但是在第一种情况下,我们仅使对象的一种方法同步,而在第二种情况下,使不可访问的Whole对象。那么,为什么这两个代码片段执行相同的操作?

java multithreading

0
推荐指数
1
解决办法
2046
查看次数