Что такое блокировка уровня класса. Можно ли объяснить с примером.
Я предполагаю, что вы имеете в виду блокировку синхронизации. Если вы не знакомы с синхронизацией, это средство предотвращения выполнения одного и того же кода двумя разными потоками в одно и то же время. В 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
}
}
}
Если вы используете ключевое слово synchronized
в static
методе, то объектом, монитор которого используется для блокировки, является объект класса, т.е. тот, который представлен литералом MyClass.class
. Он также неявно используется для синхронизации во время инициализации самого класса.
http://www.coderanch.com/t/232571/Threads-Synchronization/java/class-level-lock-object-level#1082419
синхронизировано на статическом методе :)
Это называется внутренней блокировкой, и она есть у каждого объекта. Нам нужно разделить две вещи, и не совсем понятно, что вы подразумеваете под «блокировкой на уровне класса».
Вот пример:
class Locker {
public void x() {
lock(this) { ... }
}
public void y() {
lock(this) { ... }
}
}
Как видите, оба метода используют this в качестве цели блокировки - таким образом вы можете гарантировать, что они никогда не будут чередоваться. Вы можете добиться этого неявно с помощью ключевого слова синхронизации:
class Locker {
public synchronized void x() {
...
}
public synchronized void y() {
...
}
}
Два примера одинаковы на уровне байт-кода.
Однако под блокировкой класса вы могли означать блокировку фактического объекта класса, а не его экземпляра. Так работают синхронизированные статические методы.