Java 线程八锁

本文详细解释了Java中synchronized关键字在静态方法、非静态方法、静态变量和非静态变量上的八种锁现象,探讨了它们的互斥性和锁定对象,帮助读者理解并发控制的复杂性。
摘要由CSDN通过智能技术生成

【悲观锁】Java 线程八锁

【线程】Java线程状态的转换

【悲观锁】Synchronized和ReentrantLock的区别

【线程方法】多线程下 wait、notify、park、unpark 和 await、signal 的区别

【内存】Java中的volatile

【设计模式-单例模式】Java 单例模式双重校验锁变量

【CAS-乐观锁】AtomicInteger

【乐观锁】AtomicReference

【设计模式-享元模式】Java 享元模式自定义连接池

【线程池】自定义线程池

【线程池】ThreadPoolExecutor 线程池

【线程池】Executeror 构建线程池的方法

【线程池】ThreadPoolExecutor 的拒绝策略

【悲观锁】主要的 AQS 方法

【悲观锁】ReentrantReadWriteLock

【同步工具】StampedLock

【同步工具】CountDownLatch

【同步工具】CyclicBarrier和CountDownLatch的区别

线程安全集合类

LinkedBlockingQueue 怎么实现的线程安全

"线程八锁"通常是指在Java中使用synchronized关键字时的八种不同的锁现象,也被称为"著名的八个锁"。这主要是通过对静态方法、非静态方法、静态变量和非静态变量的组合使用synchronized关键字来产生不同的效果。以下是这八种锁的情况:

1、静态同步方法,锁的是当前类的Class对象:

public class MyClass {
    public static synchronized void staticMethod() {
        // ...
    }
}

2、非静态同步方法,锁的是当前实例对象:

public class MyClass {
    public synchronized void instanceMethod() {
        // ...
    }
}

3、静态同步方法和非静态同步方法分别锁的是不同的对象,不会互斥:

public class MyClass {
    public static synchronized void staticMethod() {
        // ...
    }

    public synchronized void instanceMethod() {
        // ...
    }
}

4、在静态同步方法中调用非静态同步方法,锁的是不同的对象,不会互斥:

public class MyClass {
    public static synchronized void staticMethod() {
        // ...
        instanceMethod();
    }

    public synchronized void instanceMethod() {
        // ...
    }
}

5、在非静态同步方法中调用静态同步方法,锁的是不同的对象,不会互斥:

public class MyClass {
    public synchronized void instanceMethod() {
        // ...
        staticMethod();
    }

    public static synchronized void staticMethod() {
        // ...
    }
}

6、两个实例对象调用非静态同步方法,锁的是各自实例对象,互不干扰:

public class MyClass {
    public synchronized void instanceMethod() {
        // ...
    }
}

MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();

7、两个实例对象调用同步代码块,锁的是各自实例对象,互不干扰:

public class MyClass {
    public void instanceMethod() {
        synchronized (this) {
            // ...
        }
    }
}

MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();

8、一个实例对象调用静态同步方法,另一个实例对象调用非静态同步方法,互不干扰:

public class MyClass {
    public static synchronized void staticMethod() {
        // ...
    }

    public synchronized void instanceMethod() {
        // ...
    }
}

MyClass obj1 = new MyClass();
MyClass obj2 = new MyClass();

9、为同意一把锁

public class MyClass {
    public synchronized void staticMethod() {
        // ...
    }

    public synchronized void instanceMethod() {
        // ...
    }
}

MyClass obj = new MyClass();

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值