相关疑难解决方法(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.util.concurrentAPI提供了一个名为as的类Lock,它基本上将序列化控件以访问关键资源.它给出了诸如park()和的方法unpark().

我们可以做类似的事情,如果我们可以使用synchronized关键字,并使用wait()notify() notifyAll()方法.

我想知道其中哪一个在实践中更好,为什么?

java concurrency multithreading synchronization java.util.concurrent

173
推荐指数
7
解决办法
15万
查看次数

用于Java中的实例方法同步的等效代码

在讨论Java同步问题时,有人评论说下面的代码片段不相同(并且可能编译为不同的字节码):

public synchronized void someMethod() {
  //stuff
}
Run Code Online (Sandbox Code Playgroud)

public void someMethod() {
  synchronized (this) {
    //stuff
  }
}
Run Code Online (Sandbox Code Playgroud)

它们是等价的吗?

java synchronization

8
推荐指数
2
解决办法
2527
查看次数

Java方面的同步和性能

我刚刚意识到我需要在一个方面同步大量的数据收集代码,但性能是一个真正的问题.如果性能下降太多,我的工具将被抛弃.我将单独编写int和long,以及各种数组,ArrayLists和Maps.将有一个应用程序的多个线程将进行将由我的方面拾取的函数调用.我应该注意哪些事情会对绩效产生负面影响?什么代码模式更有效?

特别是我有一种方法可以调用许多其他数据记录方法:

void foo() {
    bar();
    woz();
    ...
}
Run Code Online (Sandbox Code Playgroud)

这些方法主要是添加方面字段的递增

void bar() {
    f++; // f is a field of the aspect
    for (int i = 0; i < ary.length; i++) {
        // get some values from aspect point cut
        if (some condiction) {
            ary[i] += someValue; // ary a field of the aspect
        }
     }
 }
Run Code Online (Sandbox Code Playgroud)

我应该单独同步foo,bar,woz和其他人,还是应该将bar,woz等中的所有代码移动到foo中并同步它?我应该this在特定创建的同步对象上进行同步:

private final Object syncObject = new Object();
Run Code Online (Sandbox Code Playgroud)

(参见这篇文章),或方法中的个别数据元素:

ArrayList<Integer> a = new ArrayList<Integer>();

void bar() {    
    synchronize(a) { …
Run Code Online (Sandbox Code Playgroud)

java performance synchronization aspectj

5
推荐指数
1
解决办法
4222
查看次数

允许方法在Java中锁定其父对象

在Java中有没有办法获得一个方法来锁定(互斥)它所在的对象?

我知道这听起来令人困惑,但基本上我对C#的这个片段并不公平,但在Java中.

lock(this)
{
    // Some code here...
}
Run Code Online (Sandbox Code Playgroud)

我的任务是将用.Net编写的API重新实现到Java中,并且我被要求保持Java版本尽可能与.Net版本类似.事实上,.Net版本看起来像是从我无法访问的C++版本转录而来的.

无论如何,上面的行出现在C#版本中,我需要在Java中做同样的事情.

c# java cross-language code-translation

4
推荐指数
2
解决办法
2611
查看次数

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

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

从对这个问题的公认答案:在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
查看次数