* 验证非静态方法的同步锁对象:this
*
* **验证思路**:由于同步代码块可以锁任意对象,如果我定义一个同步方法和声明一个同步代码块
* 分别用lock和this作为同步代码块的锁对象,用this时候如果使用同步代码块的线程能让使用同步方法的线程进入等待,而用lock时不可以
* 就说明非静态方法的同步锁对象是this。
*
* 将下面的同步代码块中,分别使用this和lock两个对象作为锁,在主方法运行后会出现下面可复现的两种情况:
* 1.用this作为锁时,在主方法里会在第一个线程等待1秒打印出“成功了”以后,第二个线程才会开始;
* 2.用lock作为锁时,在主方法里,打印完“hello world!!!”后,第二个线程就会开始打印,最后才会打印"成功了"
*
* 说明非静态方法同步锁对象是this。
public class NonStaticFunction {
Object lock = new Object();
public synchronized void fun1() throws InterruptedException {
for (int i = 1; i <= 10; i++) {
System.out.println("fun1方法的第"+i+"次运行");
Thread.sleep(50);
}
}
public void fun2() throws InterruptedException {
synchronized (lock){
System.out.println("hello world!!!");
Thread.sleep(1000);
System.out.println("成功了");
}
}
}
public class NonStaticFunctionDemo {
public static void main(String[] args) {
NonStaticFunction r = new NonStaticFunction();
new Thread(new Runnable() {
@Override
public void run() {
try {
r.fun2();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
r.fun1();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}