任何人都可以通过一个例子告诉我同步方法优于synchronized块的优势吗?
每当有关Java同步的问题出现时,有些人非常渴望指出synchronized(this)应该避免的.相反,他们声称,首选锁定私人参考.
一些给出的原因是:
其他人,包括我在内,认为这synchronized(this)是一个被大量使用的习惯用法(也在Java库中),是安全且易于理解的.它不应该被避免,因为你有一个错误,你不知道多线程程序中发生了什么.换句话说:如果适用,则使用它.
我有兴趣看到一些现实世界的例子(没有foobar的东西)避免锁定this是最好的,当synchronized(this)也做的工作.
因此:您是否应始终避免synchronized(this)并使用私有引用上的锁来替换它?
一些进一步的信息(更新为答案):
synchronized方法)和显式形式synchronized(this)synchronized(this)提供,那么synchronized(this)不适用,所以这不是问题java.util.concurrentAPI提供了一个名为as的类Lock,它基本上将序列化控件以访问关键资源.它给出了诸如park()和的方法unpark().
我们可以做类似的事情,如果我们可以使用synchronized关键字,并使用wait()和notify() notifyAll()方法.
我想知道其中哪一个在实践中更好,为什么?
java concurrency multithreading synchronization java.util.concurrent
在讨论Java同步问题时,有人评论说下面的代码片段不相同(并且可能编译为不同的字节码):
public synchronized void someMethod() {
//stuff
}
Run Code Online (Sandbox Code Playgroud)
和
public void someMethod() {
synchronized (this) {
//stuff
}
}
Run Code Online (Sandbox Code Playgroud)
它们是等价的吗?
我刚刚意识到我需要在一个方面同步大量的数据收集代码,但性能是一个真正的问题.如果性能下降太多,我的工具将被抛弃.我将单独编写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中有没有办法获得一个方法来锁定(互斥)它所在的对象?
我知道这听起来令人困惑,但基本上我对C#的这个片段并不公平,但在Java中.
lock(this)
{
// Some code here...
}
Run Code Online (Sandbox Code Playgroud)
我的任务是将用.Net编写的API重新实现到Java中,并且我被要求保持Java版本尽可能与.Net版本类似.事实上,.Net版本看起来像是从我无法访问的C++版本转录而来的.
无论如何,上面的行出现在C#版本中,我需要在Java中做同样的事情.
可能重复:
同步块与同步方法?
从对这个问题的公认答案:在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对象。那么,为什么这两个代码片段执行相同的操作?