21xrx.com
2024-11-08 22:06:01 Friday
登录
文章检索 我的文章 写文章
Java多线程锁的几种方式
2023-06-27 04:51:14 深夜i     --     --
Java 多线程 方式 并发编程

Java 多线程锁是在编写多线程程序时非常重要的一部分。在多线程程序中,许多线程可能同时尝试访问同一份代码或数据,这会导致竞争条件和其他不一致性问题。Java 中提供了多种机制来解决这些问题,包括互斥锁、信号量和内存屏障等。

下面介绍 Java 多线程锁的几种方式:

1. synchronized 块

synchronized 是 Java 语言中最常用的锁机制之一。它可以保证在任何时候,每个 synchronized 块中的语句只有一个线程在执行。当某个线程进入 synchronized 块并获得锁时,其他线程必须等待它释放锁后才能进入。synchronized 用法如下:

 javas

synchronized (sharedResource)

  // 一些共享的可变代码

这里的 sharedResource 是一个在多个线程之间共享的对象,所有需要同步的线程都必须使用这个同一对象作为锁。synchronized 关键字一般使用在需要同步访问共享资源的代码块上,以保证线程安全。

2. ReentrantLock

ReentrantLock 是一个可重入的互斥锁,它可以完全替代 synchronized 关键字,且比 synchronized 更加灵活。它提供了可中断锁和可超时锁的特性。

使用 ReentrantLock,需要定义一个显式锁对象,并调用它的 lock() 和 unlock() 方法来获取和释放锁。

 javas

ReentrantLock lock = new ReentrantLock();

lock.lock();

try

  // 共享资源的可变代码

finally

{

  lock.unlock();

}

3. Semaphore

Semaphore 是一种并发工具,它可以控制同时访问某个共享资源的线程数。Semaphore 可以看做一个计数器,它对某个共享资源允许最大的访问线程数进行计数,当访问线程数超过最大值时,其他线程只能等待。Semaphore 用法如下:

 javas

Semaphore semaphore = new Semaphore(2);

semaphore.acquire(); // 等待许可证,如果没有可用许可证,则阻塞当前线程

try

  // 共享资源的可变代码

finally

{

  semaphore.release(); // 释放许可证

}

4. CountDownLatch

CountDownLatch 是一种并发工具,它可以让某个线程等待一个或多个线程完成某个操作后再继续执行。CountDownLatch 接收一个计数器参数,表示需要等待的完成操作数。每当一个线程完成操作时,计数器就减一,当计数器为 0 时,等待线程就会被唤醒。

 javas

CountDownLatch countDownLatch = new CountDownLatch(3);

for(int i = 0; i < 3; i++)

{

  new Thread(() ->

  {

    System.out.println("子线程" + Thread.currentThread().getName() + "执行");

    countDownLatch.countDown(); // 每个线程执行完后计数器减1

  }).start();

}

countDownLatch.await(); // 等待所有线程执行完毕

System.out.println("主线程执行");

在编写多线程程序时,我们应该注意使用适当的锁机制来避免数据竞争和其他线程安全问题。上述介绍的几种锁机制提供了多种选择,可以根据不同的需求来选择合适的锁。

  
  
下一篇: C++乘法口诀表

评论区

{{item['qq_nickname']}}
()
回复
回复