admin 管理员组

文章数量: 1184232


2024年3月7日发(作者:c语言decimal)

java锁synchronized用法

Java 锁 synchronized 用法

在多线程编程中,为了避免多个线程对共享资源的并发访问导致的数据不一致性或者安全问题,我们需要使用锁来进行同步。Java 中提供了 synchronized 关键字来实现对代码块或方法的加锁操作。下面是一些常用的 synchronized 用法及详细讲解:

1.

synchronized 代码块

synchronized (obj) {

//

同步的代码块

// ...

}

– synchronized 关键字加在代码块外面,括号内指定锁对象(可以是对象实例或者 Class 类对象)。

– 在同一时刻,只能有一个线程进入 synchronized 代码块,其他线程需要等待锁释放。

– 锁对象一般建议是多个线程共享的对象。

2.

synchronized 实例方法

public synchronized void method() {

//

同步的实例方法

// ...

}

– synchronized 关键字直接修饰方法,表示整个方法被加锁。

– 作用范围为当前对象实例,同一时刻只能有一个线程执行该实例的 synchronized 方法。

– 其他线程可以同时执行其他非 synchronized 方法。

3.

synchronized 静态方法

public static synchronized void method() {

//

同步的静态方法

// ...

}

– synchronized 关键字修饰静态方法,表示整个静态方法被加锁。

– 作用范围为当前类的 Class 对象,同一时刻只能有一个线程执行该静态方法。

– 其他线程可以同时执行其他非 synchronized 静态方法。

4.

synchronized(this)

public void method() {

synchronized (this) {

//

同步的代码块

// ...

}

}

– 使用 synchronized 关键字加在代码块外面,括号内锁定当前对象实例,实现同步访问。

– 与 synchronized 实例方法类似,只影响当前对象实例的同一个 synchronized(this) 代码块。

5.

synchronized(类.class)

public void method() {

synchronized () {

//

同步的代码块

// ...

}

}

– 使用 synchronized 关键字加在代码块外面,括号内指定类对象(Class 类型)。

– 锁定整个类的所有实例,只能有一个线程进入

synchronized(类.class) 代码块。

以上是一些常见的 synchronized 用法,通过加锁来保证了线程安全。在实际的开发过程中,需要根据不同的业务场景选择合适的锁定方式,以保证线程间的安全互斥访问。

6. synchronized 重入锁

class MyClass {

public synchronized void methodA() {

//

同步的方法A

methodB();

// ...

}

public synchronized void methodB() {

//

同步的方法B

// ...

}

}

– 在 synchronized 代码块或方法中调用其他 synchronized

代码块或方法时,线程不会释放锁,而是继续持有锁进入调用的方法。

– 这种特性称为重入锁,可以防止线程死锁。

7.

synchronized 锁粒度控制

class MyClass {

private Object lock1 = new Object();

private Object lock2 = new Object();

public void methodA() {

synchronized (lock1) {

//

同步的代码块A

// ...

}

}

public void methodB() {

synchronized (lock2) {

//

同步的代码块B

// ...

}

}

}

– 可以根据业务需要,对不同的代码块使用不同的锁对象,细粒度地控制锁的范围。

– 通过使用不同的锁对象,可以提高并发性能,减小锁的竞争范围。

8.

synchronized wait 和 notify

class MyClass {

private Object lock = new Object();

public void producer() {

synchronized (lock) {

//

生产者线程逻辑

(); //

唤醒等待的消费者线程

}

}

public void consumer() {

synchronized (lock) {

try {

(); //

消费者线程等待

} catch (InterruptedException e) {

();

}

//

消费者线程逻辑

}

}

}

– 使用 synchronized、wait 和 notify 方法可以实现线程间的协作操作。

– wait 方法使当前线程进入等待状态,释放锁,并等待其他线程调用 notify 或 notifyAll 方法来唤醒。

– notify 方法唤醒一个等待的线程,notifyAll 方法唤醒所有等待的线程。

以上是关于 Java 锁 synchronized 的一些常用用法和详细讲解,可以根据实际需求选择适合的方式来实现线程安全和并发控制。在编写多线程程序时,合理地使用 synchronized 关键字可以提高程序的可靠性和性能。


本文标签: 线程 对象 方法