synchronized(this)锁住的到底是对象还是方法?我们来看一个简单的例子:
线程类JavaFunTest 在main方法中创建了两个线程。
public class JavaFunTest extends Thread{
private Test test;
public JavaFunTest(Test test) {
this.test = test;
}
@Override
public void run() {
test.printThreadName();
}
}
class Test {
public void printThreadName() {
synchronized (this) {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " , i = " + i);
}
}
}
}
1.首先我们先给两个线程类传入不同测试对象。
public static void main(String[] args) {
Test test1 = new Test();
Test test2 = new Test();
JavaFunTest javaFunTest1 = new JavaFunTest(test1);
JavaFunTest javaFunTest2 = new JavaFunTest(test1);
javaFunTest1.start();
javaFunTest2.start();
}
打印结果是:
Thread-1 , i = 0
Thread-1 , i = 1
Thread-0 , i = 0
Thread-1 , i = 2
Thread-0 , i = 1
Thread-1 , i = 3
Thread-0 , i = 2
Thread-1 , i = 4
Thread-0 , i = 3
Thread-1 , i = 5
Thread-0 , i = 4
Thread-1 , i = 6
Thread-0 , i = 5
Thread-1 , i = 7
Thread-0 , i = 6
Thread-1 , i = 8
Thread-0 , i = 7
Thread-1 , i = 9
Thread-0 , i = 8
Thread-0 , i = 9
从结果可以看出 ,线程1并未等待另一个线程执行完,而是互相争夺执行权,谁也没让着谁。
2. 其次我们给两个线程类传入相同的对象。
public static void main(String[] args) {
Test test1 = new Test();
// Test test2 = new Test();
JavaFunTest javaFunTest1 = new JavaFunTest(test1);
JavaFunTest javaFunTest2 = new JavaFunTest(test1);
javaFunTest1.start();
javaFunTest2.start();
}
再看下执行结果:
Thread-1 , i = 0
Thread-1 , i = 1
Thread-1 , i = 2
Thread-1 , i = 3
Thread-1 , i = 4
Thread-1 , i = 5
Thread-1 , i = 6
Thread-1 , i = 7
Thread-1 , i = 8
Thread-1 , i = 9
Thread-0 , i = 0
Thread-0 , i = 1
Thread-0 , i = 2
Thread-0 , i = 3
Thread-0 , i = 4
Thread-0 , i = 5
Thread-0 , i = 6
Thread-0 , i = 7
Thread-0 , i = 8
Thread-0 , i = 9
从结果来看,线程1执行完,线程0才执行,线程锁发挥作用了。
由此看出,synchronized(this)锁住的是对象。