Синхронизация методов, объектов, классов в Java
мне нужно некоторое разъяснение относительно использования synchronization
на multi-threaded environment
. У меня есть небольшой пример Class
ниже. но мне на самом деле трудно сделать тестовый пример того, как будет работать следующее; причина, по которой я хочу тестовый случай, - понять, как synchronization
обрабатывает эти различные сценарии
если
thread
звонкиSharedResource.staticMethod
, оно приобрететlock
наclass.
означает ли этоinstance
ofSharedResource
, скажем x, придется подождать, пока он получаетlock
на исполнениеx.staticMethod
.будет
synchronization
ofthis
наblock
, приобретает замок для этого раздела кода или для всегоobject
. Я. e может другойthread
называть жеmethod
наobject
; но выполните оставшуюся часть кода, которая не является частьюsynchronization block
если вышеуказанная точка истинна, имея
dummy object
tolock
on не предоставляет никаких дополнительных преимуществ. Правильно?таким образом, существуют различные уровни
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
методы экземпляра не блокируют друг друга. Но нет никакой разницы между методом " уровень " и "уровень блока"; важным моментом является то, какой объект выбран для синхронизации.