所有人都知道Java中的同步上下文可以是
我需要问;我写的时候
Dimension d = new Dimension();
synchronized(d){
// critical atomic operation
}
实际上,给定对象的同步等于实例上的同步。
所以当我写 synchronized(d),其中 d 是一个对象的实例时,那么该线程将获得所有同步实例代码块的锁。
您能否告诉我有关同步背景的更多详细信息。
您的回复将不胜感激。
答案 0 :(得分:4)
synchronized
关键字提供了对它引入的代码块(可能是整个方法)的串行访问。通过将对象用作mutex锁来完成访问的序列化。
synchronized
的三个基本用途是:
一个。在静态方法上:
static synchronized void someStaticMethod() {
// The Class object - ie "MyClass.class" - is the lock object for this block of code, which is the whole method
}
B中。在实例方法上:
synchronized void someInstanceMethod() {
// The instance - ie "this" - is lock object for this block of code, which is the whole method
}
℃。在任意代码块上:
private Object lock = new Object();
void someMethod() {
synchronized (lock) {
// The specified object is the lock object for this block of code
}
}
在所有情况下,一次只能有一个线程进入同步块。
在所有情况下,如果相同的锁对象用于多个块,则只有一个线程可以输入任何同步块。例如,如果有两个 - 其他同时线程调用方法将阻塞,直到第一个线程退出方法。
答案 1 :(得分:1)
将synchronized关键字应用于非静态方法是:
的简写public void method() {
synchronized(this) {
// method
}
}
如果将synchronized
应用于静态方法,则会在调用方法时锁定类对象(MyClass.class)。