public class Test {
public void a() {
synchronized (this) {
for (int i = 0; i < 5; i ++) {
Log.d(TAG,Thread.currentThread().getName() + ":" + i);
}
}
}
public void b() {
for (int i = 0; i < 5; i ++) {
Log.d(TAG, Thread.currentThread().getName() + ":" + i);
}
synchronized (this) {
for (int i = 0; i < 5; i ++) {
Log.d(TAG, Thread.currentThread().getName() + ":" + i);
}
}
}
}
同一个对象中synchronized (this)修饰的代码段都会阻塞(调用a方法,不光a方法阻塞b方法中被synchronized (this)包围的代码也阻塞),this表示拿到本对象的锁。
public class Test {
public void a() {
synchronized (this) {
for (int i = 0; i < 5; i ++) {
Log.d(TAG,Thread.currentThread().getName() + ":" + i);
}
}
}
synchronized public void b() {
for (int i = 0; i < 5; i ++) {
Log.d(TAG, Thread.currentThread().getName() + ":" + i);
}
}
}
synchronized修饰方法b,此时a被调用意味着Test对象的锁被拿到,则整个方法b都被阻塞,与synchronized(this)包含整个b函数中的代码效果一样。
synchronized(this)只对同一个对象起作用,要想同步所有对象需要使用synchronized(Test.class),注意对象锁与类锁混用的话synchronized(this)只对synchronized(this)起作用,synchronized(Test.class)只对synchronized(Test.class)起作用,说明synchronized(this)与synchronized(Test.class)是不同的锁,同时使用一定要搞清楚。