Что такое уровень класса, привязывают Java

Что такое блокировка уровня класса. Можно ли объяснить с примером.

5
задан Kris 17 March 2010 в 12:33
поделиться

4 ответа

Я предполагаю, что вы имеете в виду блокировку синхронизации. Если вы не знакомы с синхронизацией, это средство предотвращения выполнения одного и того же кода двумя разными потоками в одно и то же время. В java синхронизация выполняется с помощью объектных блокировок:

Object lock = new Object();

public void doSomething(){
  ...
  synchronized(lock){
    //something dangerous
  }
  ...
}

В этом коде гарантируется, что только один поток может делать что-то опасное в данный момент времени, и он завершит все в синхронизированном блоке, прежде чем другой поток сможет начать выполнять тот же код. Я предполагаю, что то, что вы имеете в виду под "блокировкой на уровне класса", является неявной блокировкой синхронизированного метода:

public synchronized void somethingDangerous(){...}

Здесь снова только один поток может выполнить метод в любой момент времени и всегда завершит его до того, как другой поток сможет начать выполнение кода. Это эквивалентно синхронизированному блоку на "this":

public void somethingDangerous(){
  synchronized(this){
    //something dangerous
  }
}

Теперь эта блокировка на самом деле не на класс, а скорее на отдельный экземпляр (т.е. не на все часы, а только на ваши часы). Если вы хотите получить настоящую "блокировку на уровне класса" (что обычно делается в статическом методе), то вам нужно синхронизироваться на чем-то независимом от экземпляров. Например:

public class Clock{
  private static Object CLASS_LOCK = new Object();

  public static void doSomething(){
    ...
    synchronized(CLASS_LOCK){
      //something dangerous to all clocks, not just yours
    }
    ...
  }
}

снова существует неявная блокировка для статических методов:

public class Clock{
  public static synchronized void somethingDangerous(){}
}

что эквивалентно блокировке объекта класса:

public class Clock{
  public static void somethingDangerous(){
    synchronized(Clock.class){
      //do something dangerous
    }
  }
}
23
ответ дан 18 December 2019 в 05:49
поделиться

Если вы используете ключевое слово synchronized в static методе, то объектом, монитор которого используется для блокировки, является объект класса, т.е. тот, который представлен литералом MyClass.class. Он также неявно используется для синхронизации во время инициализации самого класса.

4
ответ дан 18 December 2019 в 05:49
поделиться

http://www.coderanch.com/t/232571/Threads-Synchronization/java/class-level-lock-object-level#1082419

синхронизировано на статическом методе :)

0
ответ дан 18 December 2019 в 05:49
поделиться

Это называется внутренней блокировкой, и она есть у каждого объекта. Нам нужно разделить две вещи, и не совсем понятно, что вы подразумеваете под «блокировкой на уровне класса».

Вот пример:

class Locker {
    public void x() {
        lock(this) { ... }
    }

    public void y() {
        lock(this) { ... }
    }
}

Как видите, оба метода используют this в качестве цели блокировки - таким образом вы можете гарантировать, что они никогда не будут чередоваться. Вы можете добиться этого неявно с помощью ключевого слова синхронизации:

class Locker {
    public synchronized void x() {
        ...
    }

    public synchronized void y() {
        ...
    }
}

Два примера одинаковы на уровне байт-кода.

Однако под блокировкой класса вы могли означать блокировку фактического объекта класса, а не его экземпляра. Так работают синхронизированные статические методы.

2
ответ дан 18 December 2019 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: