synchronized的monitor监视器

public class T {

    @SneakyThrows
    public static void main(String[] args) {
        System.out.println("此行后加锁 monitorenter");
        synchronized (T.class){
            System.out.println("hello monitor");
        }
        System.out.println("此行前释放锁 monitorexit");
    }

}

反汇编字节码:javap -c T

线程争抢锁

示例

需求:正确计数

synchronized

public class T {

    int i = 0;

    @SneakyThrows
    public static void main(String[] args) {
        T t = new T();
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                t.countSafe();
            }).start();
        }
    }

    //计数错误
    @SneakyThrows
    public void count() {
        Thread.sleep(100);
        i++;
        System.out.println(i);
    }

    //线程安全 正确计数
    @SneakyThrows
    public synchronized void countSafe() {
        Thread.sleep(100);
        i++;
        System.out.println(i);
    }
}

AtomicInteger

public class T {

    AtomicInteger count = new AtomicInteger(1);

    @SneakyThrows
    public static void main(String[] args) {
        T t = new T();
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                t.countSafe();
            }).start();
        }
    }

    //线程安全 正确计数
    @SneakyThrows
    public void countSafe() {
        Thread.sleep(300);
        System.out.println(count.getAndIncrement());
    }
}

posted @ 2024-11-05 11:45  干饭达人GoodLucy  阅读(2)  评论(0编辑  收藏  举报