[英]Synchronized block will lock the whole object or the method alone?
我在类中有多个方法,大多数方法都有关键部分(共享数据)。 所以我把这些方法做成了同步。 假设线程t1正在运行其中一个同步块。 同时线程t2可以访问其他方法的关键部分吗?
class Sample{
synchronized public void method1(){
}
synchronized public void method2(){
}
synchronized public void method3(){
}
public void method4(){
}
}
synchronized始终锁定对象。 在同步方法的情况下,对象就是this
。 所以基本上这两种方法都是一样的:
synchronized public void method1() {
// do something
}
和
public void method1() {
synchronized(this){
// do something
}
}
只要一个线程锁定锁定对象,就没有其他线程可以锁定此对象。 因此,在您的示例中,同步方法(一,二和三)永远不能同时执行。 method4
未同步,因此它可以随时访问该对象。
如果你想要一个更细粒度锁,因为method1
和method2
应该是排他性和method3
和method4
,你可以使用例如是这样的:
class Sample{
private final Object lock1 = new Object();
private final Object lock2 = new Object();
public void method1(){
synchronized(lock1) {
// do something
}
}
public void method2(){
synchronized(lock1) {
// do something
}
}
public void method3(){
synchronized(lock2) {
// do something
}
}
public void method4(){
synchronized(lock2) {
// do something
}
}
}
然后,您甚至可以使用synchonized(lock)
方法来包装需要同步的语句,而不是整个方法:
public void method() {
// some code
synchronized(lock) {
// code that must be synchronized
}
// some other code
}
使用这种方法,您可以将锁定持续时间降至最低。
对同一对象的两个同步方法的调用不可能进行交错。 当一个线程正在为对象执行同步方法时,所有其他线程调用同一对象的同步方法(暂停执行)直到第一个线程完成对象。
当synchronized方法退出时,它会自动与同一对象的同步方法的任何后续调用建立before-before关系。 这可以保证对所有线程都可以看到对象状态的更改
在这种情况下
Sample sample1 = new Sample();
多个线程无法访问
sample1.method1(),sample1.method2(),sample1.method3()
但是多个线程可以同时访问
sample1.method4()
如果我们有2个对象
Sample sample1 = new Sample();
Sample sample2 = new Sample();
多个线程可以并行访问
sample1.method1(),sample2.method1() etc.
所以锁是在对象级别
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.