📜  Java的对象级锁与类级锁(1)

📅  最后修改于: 2023-12-03 14:43:02.892000             🧑  作者: Mango

Java的对象级锁与类级锁介绍

在Java中,锁是一种重要的线程同步机制。锁可以确保在共享资源上只有一个线程执行代码,从而防止并发冲突。

Java中的锁可以分为两种类型:对象级锁和类级锁。

对象级锁

对象级锁也称为实例锁。它只作用于类的实例对象上。在使用对象级锁时,只有持有该对象的线程才能访问被锁定的代码块,其他线程需要等待直到该线程释放锁。

使用对象级锁的方式有两种:

使用synchronized关键字

synchronized关键字可以用来表示一个代码块或整个方法需要同步。在Java中,只有方法或代码块被标记为synchronized,才能使用对象级锁。具体的实现方式如下:

public class ObjectLockDemo {
    private int count = 0;
    private Object lock = new Object(); // 声明一个锁对象

    public void increment() {
        synchronized(lock) { // 使用锁对象锁定代码块
            count++;
        }
    }
}
使用Lock接口

Java还提供了一个java.util.concurrent.locks.Lock接口,通过该接口可以进行显示地锁定和解锁。具体的实现方式如下:

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ObjectLockDemo {
    private int count = 0;
    private Lock lock = new ReentrantLock(); // 创建一个重入锁对象

    public void increment() {
        lock.lock(); // 锁定
        try {
            count++;
        } finally {
            lock.unlock(); // 解锁
        }
    }
}
类级锁

类级锁也称为静态锁。它作用于整个类的静态方法上。在使用类级锁时,只有持有该类的线程才能访问被锁定的代码块,其他线程需要等待直到该线程释放锁。

使用类级锁的方式有两种:

使用synchronized关键字

synchronized关键字也可以用来表示一个静态方法需要同步。在Java中,只有静态方法被标记为synchronized,才能使用类级锁。具体的实现方式如下:

public class ClassLockDemo {
    private static int count = 0;

    public static synchronized void increment() { // 使用synchronized修饰静态方法
        count++;
    }
}
使用Lock接口

和对象级锁类似,Java提供了java.util.concurrent.locks.Lock接口,通过该接口可以进行显示地锁定和解锁静态方法。具体的实现方式如下:

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ClassLockDemo {
    private static int count = 0;
    private static Lock lock = new ReentrantLock(); // 创建一个重入锁对象

    public static void increment() {
        lock.lock(); // 锁定
        try {
            count++;
        } finally {
            lock.unlock(); // 解锁
        }
    }
}
总结

Java的对象级锁和类级锁都可以用来保证多线程安全访问。在使用锁时需要考虑锁粒度,过高的锁粒度可能引发死锁等问题,过低的锁粒度可能会影响锁的效率。用户需要根据具体的应用场景和需求来选择合适的锁。