是否有任何不同级别的同步?

时间:2010-01-20 06:36:25

标签: java synchronization

我听说有不同级别的Synchronization.are吗?(如果有的话,请你用代码片段解释一下吗?)谢谢。

3 个答案:

答案 0 :(得分:3)

在Java 5之前,只有一个:synchronized关键字。这等待并获得对参考对象的独占锁定。应用于函数时:

public synchronized void doStuff() { ... }

正在同步的对象是this

Java 5添加了许多并发工具,其中一个是Lock对象。这有几个版本,包括ReadWriteLock。这是我唯一可以想到的,你可能会指的是。

synchronized的问题在于它相当粗糙。做得很糟,它可能导致死锁。 Java 5 utils允许非阻塞锁定获取,锁定获取超时和读/写锁定支持。

答案 1 :(得分:3)

您真的需要解释“同步级别”的含义。你在谈论之间的区别:

public synchronized void foo()
{
    ...
}

public void foo()
{
    synchronized(lock)
    {
        ...
    }
}

?或者也许在上面和使用来自java.util.concurrent.locks的锁?

之间

如果您能为您所听到的内容提供更多背景信息,我们可能会更好地为您提供帮助。更重要的是,您认为可能需要此信息的问题是什么?

答案 2 :(得分:0)

我假设OP指的是多线程中使用的对象的同步而不是Java中的关键字。

在阅读 Goetz 之后,我理解了Java中不同级别的同步。

让我们假设我们有一个对象,我们必须使用132个线程,这些对象连续使用 对象,纯粹随机,超过100年。

abstract Class ICount {
int i;
String iString;
public void add(int i);
public void sub(int i);
public void synchronized print(){
  assert(i == Integer.valueOf(iString));
  System.out.println("i"+String.valueof(i)+" == "+iString);
   }
}

现在可能有不同的实现,无论是设计还是粗心,都是不同级别的线程安全。

  1. 线程安全同步实现:保证任何不使用反射来破坏对象的java代码,使用此实现,都不会命中断言。
  2. 并发同步实现:除了保证线程安全之外,该实现的作者试图在可能的情况下允许并发执行,并且还试图避免锁定(争用)。
  3. 线程不安全的同步实现:开发人员,至少知道他的类不是线程安全的,并且要求你不要使用这个实现,除非你只有一个线程。
  4. 如果这是一个真正的问题,大多数实际实现属于第四类“同步”,这有时是有效的,而且文档不足以在上述类别之一中进行分类,因此默认情况下属于第四类。