验证非静态方法的锁对象是this(静态方法可参照同样验证)

69 阅读1分钟
* 验证非静态方法的同步锁对象: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();
        
    }

}