Синхронизация методов, объектов, классов в Java
мне нужно некоторое разъяснение относительно использования synchronization на multi-threaded environment. У меня есть небольшой пример Class ниже. но мне на самом деле трудно сделать тестовый пример того, как будет работать следующее; причина, по которой я хочу тестовый случай, - понять, как synchronization обрабатывает эти различные сценарии
если
threadзвонкиSharedResource.staticMethod, оно приобрететlockнаclass.означает ли этоinstanceofSharedResource, скажем x, придется подождать, пока он получаетlockна исполнениеx.staticMethod.будет
synchronizationofthisнаblock, приобретает замок для этого раздела кода или для всегоobject. Я. e может другойthreadназывать жеmethodнаobject; но выполните оставшуюся часть кода, которая не является частьюsynchronization blockесли вышеуказанная точка истинна, имея
dummy objecttolockon не предоставляет никаких дополнительных преимуществ. Правильно?таким образом, существуют различные уровни
synchronziations. , иblock level. так что это будет означатьlocksдля этих отдельных уровней должны существовать? Если бы я приобрел замок наObject, другойThreadне может вызывать каких-либоmethodsнаsame object, а если я приобрел замок наmethod, другойthreadможет получить блокировку на другойmethod. Правильно ли это?
некоторые советы по как создать два потока, которые действуют на один и тот же объект и один и тот же метод, будет полезно (я понимаю, что мне нужно расширить Thread класс или реализация Runnable интерфейс). Но не уверен, как заставить два потока вызывать один и тот же метод на одном объекте.
class SharedResource {
public Integer x =0;
public static Integer y=0;
Object dummy = new Object();
public Integer z=0;
public synchronized static void staticMethod(){
System.out.println("static Method is called");
y++;
}
public synchronized void incrementX(){
System.out.println("instance method; incrementX");
x++;
}
public void incrementXBlock(){
synchronized(this){
x++;
}
System.out.println("instance method; incrementXBlock");
}
public void incrementZ(){
synchronized (dummy) {
z++;
}
System.out.println("synchronized on dummy; incrementZ method ");
}
}
public class ThreadSynchronization extends Thread {
}
я читал эти сообщения, но я не уверен, если я понял это ясно.
блокировка синхронизированного метода Java на объекте или методе?, включает ли Java monitor экземпляр переменные?
1 ответов
class SharedResource {
public synchronized static void staticMethod(){
System.out.println("static Method is called");
y++;
}
public synchronized void incrementX(){
System.out.println("instance method; incrementX");
x++;
}
}
тут же
class SharedResource {
public static void staticMethod(){
synchronized(SharedResource.class) {
System.out.println("static Method is called");
y++;
}
}
public void incrementX(){
synchronized(this) {
System.out.println("instance method; incrementX");
x++;
}
}
}
проще говоря, поток, входящий в синхронизированный блок, получит блокировку на указанном объекте в течение всего блока. Это означает, что не более одного потока может выполнить synchronized блок кода для конкретного объекта блокировки. С Class экземпляр и конкретный экземпляр этого класса-разные объекты,synchronized static методы и synchronized методы экземпляра не блокируют друг друга. Но нет никакой разницы между методом " уровень " и "уровень блока"; важным моментом является то, какой объект выбран для синхронизации.