相关疑难解决方法(0)

避免在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中,在代码中声明关键部分的惯用方法如下:

private void doSomething() {
  // thread-safe code
  synchronized(this) {
    // thread-unsafe code
  }
  // thread-safe code
}
Run Code Online (Sandbox Code Playgroud)

几乎所有的块都同步 this,但是有什么特别的原因吗?还有其他可能吗?是否有关于同步对象的最佳实践?(比如私人实例Object?)

java multithreading synchronized

70
推荐指数
5
解决办法
4万
查看次数

Java中的synchronized方法和synchronized块之间有什么区别?

Java中的synchronized方法和synchronized块之间有什么区别?

我一直在网上搜索答案,人们似乎对这一个如此不确定:-(

我的看法是两者之间没有区别,除了同步块可能在范围内更加局部化,因此锁定的时间会更短?

如果是静态方法上的Lock,那么Lock是什么?锁定类的含义是什么?

java multithreading synchronization synchronized synchronized-block

36
推荐指数
3
解决办法
4万
查看次数

用于显示java synchronized块如何工作的示例代码

我正在学习java多线程,我发现很难理解synchronized块的工作原理:

 synchronized(Object o){
     // do something
    }
Run Code Online (Sandbox Code Playgroud)

请给出一些示例代码,可以显示对象o被阻止.根据我的理解,在同步块被执行时,将阻止从另一个线程访问对象o?

java thread-synchronization

23
推荐指数
1
解决办法
6万
查看次数

java语法:"synchronized(this)"

能告诉我这段java代码吗?我无法理解这种语法.

synchronized (this) {
              try {
                  wait(endTime - System.currentTimeMillis());
              } catch (Exception e) {
              }
}
Run Code Online (Sandbox Code Playgroud)

java syntax synchronized

19
推荐指数
2
解决办法
2万
查看次数

同步块和监视器对象

嗨,有人可以解释,如果在以下代码中,同步代码将限制对线程的访问.如果是,它是如何区别的,如果我们使用"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)

java

7
推荐指数
2
解决办法
6268
查看次数

在java中的单身人士

我只需要在某处阅读以下代码:

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,为什么我们需要这个代码呢?

java singleton static lazy-loading

5
推荐指数
2
解决办法
2664
查看次数

synchronized方法与synchronized块

如果我有以下代码

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)并行运行.
谢谢.

java concurrency

4
推荐指数
1
解决办法
1500
查看次数

java中的"隐式"同步?

当我有一个像这样的方法

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

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

java synchronization

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