每当有关Java同步的问题出现时,有些人非常渴望指出synchronized(this)
应该避免的.相反,他们声称,首选锁定私人参考.
一些给出的原因是:
其他人,包括我在内,认为这synchronized(this)
是一个被大量使用的习惯用法(也在Java库中),是安全且易于理解的.它不应该被避免,因为你有一个错误,你不知道多线程程序中发生了什么.换句话说:如果适用,则使用它.
我有兴趣看到一些现实世界的例子(没有foobar的东西)避免锁定this
是最好的,当synchronized(this)
也做的工作.
因此:您是否应始终避免synchronized(this)
并使用私有引用上的锁来替换它?
一些进一步的信息(更新为答案):
synchronized
方法)和显式形式synchronized(this)
synchronized(this)
提供,那么synchronized(this)
不适用,所以这不是问题java.util.concurrent
API提供了一个名为as的类Lock
,它基本上将序列化控件以访问关键资源.它给出了诸如park()
和的方法unpark()
.
我们可以做类似的事情,如果我们可以使用synchronized
关键字,并使用wait()
和notify() notifyAll()
方法.
我想知道其中哪一个在实践中更好,为什么?
java concurrency multithreading synchronization java.util.concurrent
在Java中,在代码中声明关键部分的惯用方法如下:
private void doSomething() {
// thread-safe code
synchronized(this) {
// thread-unsafe code
}
// thread-safe code
}
Run Code Online (Sandbox Code Playgroud)
几乎所有的块都同步 this
,但是有什么特别的原因吗?还有其他可能吗?是否有关于同步对象的最佳实践?(比如私人实例Object
?)
Java中的synchronized方法和synchronized块之间有什么区别?
我一直在网上搜索答案,人们似乎对这一个如此不确定:-(
我的看法是两者之间没有区别,除了同步块可能在范围内更加局部化,因此锁定的时间会更短?
如果是静态方法上的Lock,那么Lock是什么?锁定类的含义是什么?
java multithreading synchronization synchronized synchronized-block
我正在学习java多线程,我发现很难理解synchronized块的工作原理:
synchronized(Object o){
// do something
}
Run Code Online (Sandbox Code Playgroud)
请给出一些示例代码,可以显示对象o被阻止.根据我的理解,在同步块被执行时,将阻止从另一个线程访问对象o?
能告诉我这段java代码吗?我无法理解这种语法.
synchronized (this) {
try {
wait(endTime - System.currentTimeMillis());
} catch (Exception e) {
}
}
Run Code Online (Sandbox Code Playgroud) 嗨,有人可以解释,如果在以下代码中,同步代码将限制对线程的访问.如果是,它是如何区别的,如果我们使用"this"作为监视器对象而不是"msg".
public void display(String msg)
{
synchronized(msg)
{
for(int i=1;i<=20;i++)
{
System.out.println("Name= "+msg);
}
}
}
Run Code Online (Sandbox Code Playgroud) 我只需要在某处阅读以下代码:
public class SingletonObjectDemo {
private static SingletonObjectDemo singletonObject;
// Note that the constructor is private
private SingletonObjectDemo() {
// Optional Code
}
public static SingletonObjectDemo getSingletonObject() {
if (singletonObject == null) {
singletonObject = new SingletonObjectDemo();
}
return singletonObject;
}
}
Run Code Online (Sandbox Code Playgroud)
我需要知道这部分需要什么:
if (singletonObject == null) {
singletonObject = new SingletonObjectDemo();
}
Run Code Online (Sandbox Code Playgroud)
如果我们不使用这部分代码怎么办?仍然会有一个副本SingletonObjectDemo
,为什么我们需要这个代码呢?
如果我有以下代码
class SomeClass {
...
public synchronized methodA() {
....
}
public synchronized methodB(){
....
}
}
Run Code Online (Sandbox Code Playgroud)
这将在'this'对象上同步.
但是,如果我的主要目标是确保多个线程不同时使用methodA(或methodB),但是它们可以同时使用methodA和methodB,
那么这种设计是否有限制?因为这里thread1锁定对象(与对象关联的监视对象)以运行methodA但同时thread2也在等待对象锁,即使methodA和methodB可以并发运行.
这种理解是否正确?
如果是,这是我们在私有虚拟对象上使用synchronized块的情况,以便methodA和methodB可以与不同的线程并行运行,但不能与不同线程的methodA(或methodB)并行运行.
谢谢.
当我有一个像这样的方法
public void unsynchronizedMethod(){
callSynchronizedMethod();
//dosomestuff after this line
}
Run Code Online (Sandbox Code Playgroud)
是否意味着在调用unsynchronizedMethod() - Method中的callSynchronizedMethod()后,所有内容都是隐式同步的?