JAVA基础—Synchronized线程同步机制

Synchronize的使用场景

Synchronize可以使用在一下三种场景,对应不同的锁对象

场景 synchronized代码块 synchronized方法 synchronized静态方法
锁对象 任意对象 this 对象 该类的字节码对象 *.class

没有同步代码实例

public class SyncSample {
    public static void main(String[] args) {
        Couplet couplet = new Couplet();
        for (int i = 1; i < 1000; i++)
            new Thread() {
                public void run() {
                    int r = new Random().nextInt(2);
                    if (r % 2 == 0){
                        couplet.first();
                    }else {
                        couplet.second();
                    }
                }
            }.start();
    }
}

class Couplet {
    public void first() {
        System.out.printf("琴");
        System.out.printf("瑟");
        System.out.printf("琵");
        System.out.printf("琶");
        System.out.println();
    }

    public void second() {
        System.out.printf("魑");
        System.out.printf("魅");
        System.out.printf("魍");
        System.out.printf("魉");
        System.out.println();
    }
}

运行结果

...
魑魅魍魉
琴瑟琵琶
琴瑟琴瑟琵琶
魍魉
琴瑟琵琶
琴瑟琵魅魍魉
魑魅瑟琵琶

1. synchronized代码块 解决

class Couplet {
    //创建锁对象 可以是任意对象 也可用当前对象this
    Object lock = new Object();

    public void first() {
        //代码块 需要有锁对象
        synchronized (lock) {
            System.out.printf("琴");
            System.out.printf("瑟");
            System.out.printf("琵");
            System.out.printf("琶");
            System.out.println();
        }
    }

    public void second() {
        //代码块 需要有锁对象
        synchronized (lock) {
            System.out.printf("魑");
            System.out.printf("魅");
            System.out.printf("魍");
            System.out.printf("魉");
            System.out.println();
        }
    }
}

运行结果

琴瑟琵琶
魑魅魍魉
琴瑟琵琶
魑魅魍魉

2. synchronized方法 同步方法解决

class Couplet {

    //同步方法 this当前对象就是锁对象
    public synchronized void first() {
        System.out.printf("琴");
        System.out.printf("瑟");
        System.out.printf("琵");
        System.out.printf("琶");
        System.out.println();
    }

    //代码块与同步方法 同步时 使用this当前对象
    public void second() {
        synchronized (this){
            System.out.printf("魑");
            System.out.printf("魅");
            System.out.printf("魍");
            System.out.printf("魉");
            System.out.println();
        }
    }
}

运行结果

琴瑟琵琶
魑魅魍魉
琴瑟琵琶
魑魅魍魉

3. synchronized静态方法

class Couplet {
    //静态同步方法 当前对象.class 的字节码对象就是锁对象
    public synchronized static void first() {
        System.out.printf("琴");
        System.out.printf("瑟");
        System.out.printf("琵");
        System.out.printf("琶");
        System.out.println();
    }

    //代码块与静态方法同步时 使用当前字节码锁对象
    public void second() {
        synchronized (Couplet.class){
            System.out.printf("魑");
            System.out.printf("魅");
            System.out.printf("魍");
            System.out.printf("魉");
            System.out.println();
        }
    }
}

运行结果

琴瑟琵琶
魑魅魍魉
琴瑟琵琶
魑魅魍魉

你可能感兴趣的:(JAVA基础—Synchronized线程同步机制)