同步方法-java

除了同步代码块能实现同步执行外,同步方法也可以。

先看下同步代码块实现同步执行:

public class Demo4 {
    public static void main(String[] args) {
        Demo d = new Demo();

        new Thread() {
            @Override
            public void run(){
                while (true){
                    d.print1();
                }
            }
        }.start();

        new Thread() {
            @Override
            public void run(){
                while (true){
                    d.print2();
                }
            }
        }.start();
    }
}

class Demo{
    Object o = new Object();
    public void print1(){
        synchronized (o){                            // synchronized ()传入一个对象即可,相当于一把锁
                System.out.print("我");
                System.out.print("好");
                System.out.print("饿");
                System.out.print("啊");
                System.out.print("
");
        }
    }

    public void print2(){
        synchronized (o){                             // synchronized () 传入的对象要和上面的一样
                System.out.print("想");
                System.out.print("吃");
                System.out.print("汉");
                System.out.print("堡");
                System.out.print("包");
                System.out.print("
");
        }
    }
}

同步方法实现同步执行:

public class Demo5 {
    public static void main(String[] args) {
        Demo6 d = new Demo6();
        new Thread() {
            @Override
            public void run(){
                while (true){
                    d.print1();
                }
            }
        }.start();

        new Thread() {
            @Override
            public void run(){
                while (true){
                    d.print2();
                }
            }
        }.start();
    }

}

class Demo6{
    public synchronized void print1(){
        System.out.print("我");
        System.out.print("好");
        System.out.print("饿");
        System.out.print("啊");
        System.out.print("
");
    }

    public synchronized void print2(){
        System.out.print("想");
        System.out.print("吃");
        System.out.print("汉");
        System.out.print("堡");
        System.out.print("包");
        System.out.print("
");
    }
}

同步方法的锁对象是什么呢?

在同步代码块实现同步执行的代码中,我们可以很清楚地看到锁对象是Object o(当然其他的也可以)。那么同步方法的锁对象是什么呢?

经过实验,发现:

非静态的同步方法的锁对象是this

静态的同步方法的锁对象是该类的字节码对象

原文地址:https://www.cnblogs.com/chichung/p/10287810.html