Java中的锁实战

本文详细探讨了Java中的synchronized关键字在不同场景下的使用,包括对象锁、类锁、同步方法以及可重入锁等特性。通过实例展示了synchronized如何保证线程安全,并分析了异常情况下锁的释放以及锁升级的过程。文章还提醒读者在处理并发时需要注意异常处理,以避免数据不一致的情况发生。
摘要由CSDN通过智能技术生成

一 对某个对象加锁

// 锁的是对象,不是代码
public class T {
    private int count = 10;
    private Object o = new Object();

    public void m() {
        // 任何线程要执行下面的代码,必须先拿到 o 的锁,只有拿到 o 这把锁,才能执行下面这段代码。
        // 一旦 A 线程拿到这把锁,B 线程只有等 A 线程执行完,释放了 o 这把锁,B 再获取这把锁,B 线程才能执行。
        synchronized (o) {
            count--;
            System.out.println(Thread.currentThread().getName() + " count = " + count);
        }
    }
}

二 用当前对象当锁

public class T {
    private int count = 10;

    public void m() {
        // 锁的是 this
        synchronized (this) { // 任何线程要执行下面的代码,必须先拿到 this 的锁,用当前对象当锁
            count--;
            System.out.println(Thread.currentThread().getName() + " count = " + count);
        }
    }
}

三 在方法前加 synchronized

public class T {
    private int count = 10;
    public synchronized void m() { // 等同于在方法代码执行时加 synchronized(this)
        count--;
        System.out.println(Thread.currentThread().getName() + " count = " + count);
    }
}

四 静态方法前加 synchronized

public class T {
    private static int count = 10;
    // 锁的是 XX.class
    public synchronized static void m() { // 这里等同于 synchronized(T.class)
        count--;
        System.out.println(Thread.currentThread().getName() + " count = " + count);
    }

    public static void mm() {
        synchronized (T.class) { // 这里不能写成 synchronized(this)
            count--;
        }
    }
}

五 synchronized 的小测试

1 代码

public class T implements Runnable {
    private /*volatile*/ int count = 100;


    public synchronized void run() { // 必须加 synchronized ,否则两个不同的线程可能会输出相同的值
        count--;
        System.out.println(Thread.currentThread().getName() + " 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值