【java技术总结】关于synchronized的使用

Synchronized使用的三种方式:

  1. synchronized代码块-----可以指定任意对象,和synchronized方法联用要指向当前对象this
  2. synchronized方法-----this当前对象
  3. synchronized静态方法-----该类的字节码对象

 三种方法中2和3都可以用1来等价:

锁方法和锁静态方法分别相当于代码块锁当前对象和锁字节码对象,而代码块只需要指向相同的对象即可实现加锁

测试类:

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

        }
    }
}

 

1.synchronized代码块

需要指向同一对象

class Couplet {
    Object lock = new Object();

    public void first() {
        synchronized (lock) {
            System.out.print("琴");
            System.out.print("瑟");
            System.out.print("琵");
            System.out.print("琶");
            System.out.println();
        }
    }

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

2.synchronized方法

class Couplet {
    Object lock = new Object();

    public synchronized void first() {
            System.out.print("琴");
            System.out.print("瑟");
            System.out.print("琵");
            System.out.print("琶");
            System.out.println();
    }

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

}

 

两种混用

class Couplet {
    Object lock = new Object();

    public synchronized void first() {
            System.out.print("琴");
            System.out.print("瑟");
            System.out.print("琵");
            System.out.print("琶");
            System.out.println();
    }

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

}

3.synchronized静态方法

测试类改静态调用:

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

        }
    }
}

 

class Couplet {
    Object lock = new Object();

    public synchronized static void first() {
            System.out.print("琴");
            System.out.print("瑟");
            System.out.print("琵");
            System.out.print("琶");
            System.out.println();
    }

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

}

混用

class Couplet {
    Object lock = new Object();

    public synchronized static void first() {
            System.out.print("琴");
            System.out.print("瑟");
            System.out.print("琵");
            System.out.print("琶");
            System.out.println();
    }

    public static void second() {
        synchronized (Couplet.class) {
            System.out.print("魑");
            System.out.print("魅");
            System.out.print("魍");
            System.out.print("魉");
            System.out.println();
        }
    }
}

 

posted @ 2022-10-10 09:38  求道之愚者  阅读(25)  评论(0)    收藏  举报