首页 > 编程语言 >Java多线程:锁机制深入剖析

Java多线程:锁机制深入剖析

时间:2023-12-26 11:31:56浏览次数:36  
标签:共享资源 Java synchronized 访问 lock 剖析 并发 多线程

在并发编程中,正确地管理资源的访问至关重要。Java提供了多种锁机制来协调多个线程之间对共享资源的访问。本文将深入探讨Java多线程中的锁机制,包括内置锁(synchronized关键字)、显式锁(java.util.concurrent.locks.Lock)以及并发集合(java.util.concurrent)提供的锁机制。

1. 内置锁(Synchronized)

Java中的每个对象都可以作为锁,这种机制称为内置锁或监视器锁。使用synchronized关键字可以很容易地实现对一个对象的同步访问。

1.1 同步实例方法

public synchronized void syncMethod() {
    // 访问或修改共享资源
}

当一个线程访问一个对象的synchronized实例方法时,它持有该对象的锁,其他线程将无法进入该对象的任何synchronized实例方法。

1.2 同步静态方法

public static synchronized void syncStaticMethod() {
    // 访问或修改共享资源
}

同步静态方法锁定的是类对象(Class对象),即所有实例共享的锁。

1.3 同步代码块

public void method() {
    synchronized(this) {
        // 访问或修改共享资源
    }
}

同步代码块允许更精细地控制锁的获取和释放。

2. 显式锁(Lock)

Java 5引入了java.util.concurrent.locks包,它提供了更复杂的锁操作。ReentrantLock是一个可重入的互斥锁,它具有与synchronized相同的基本行为和语义,但增加了更多的功能。

2.1 ReentrantLock的使用

Lock lock = new ReentrantLock();

public void method() {
    lock.lock();
    try {
        // 访问或修改共享资源
    } finally {
        lock.unlock();
    }
}

ReentrantLock提供了等待尝试锁(tryLock)、可中断地获取锁(lockInterruptibly)以及公平锁等高级功能。

2.2 条件变量(Condition)

ReentrantLock还可以与Condition一起使用,提供类似Object.wait()/notify()/notifyAll()的功能。

Condition condition = lock.newCondition();

public void method() {
    lock.lock();
    try {
        while (/* 条件不满足 */) {
            condition.await();
        }
        // 访问或修改共享资源
        condition.signalAll();
    } finally {
        lock.unlock();
    }
}

3. 并发集合的锁机制

Java的并发包还提供了一系列的并发集合类,如ConcurrentHashMap、CopyOnWriteArrayList等,它们内部实现了高效的并发控制,以减少锁的争用。

3.1 ConcurrentHashMap

ConcurrentHashMap使用了一种分段锁的技术,允许多个线程并发地读写不同段的数据,从而提高了并发性能。

ConcurrentMap<String, String> map = new ConcurrentHashMap<>();
map.put("key", "value");

3.2 CopyOnWriteArrayList

CopyOnWriteArrayList在写操作时通过创建原始内容的新副本来避免锁的使用,从而实现线程安全。

List<String> list = new CopyOnWriteArrayList<>();
list.add("element");

结论

理解和使用各种锁机制是Java并发编程的关键。内置锁提供了简单的同步方法,而显式锁则提供了更多的灵活性和高级功能。此外,Java并发包中的并发集合类为常见的并发场景提供了优化的解决方案。作为开发者,我们需要根据实际的应用场景选择最合适的锁机制,以实现高效且安全的并发控制。

标签:共享资源,Java,synchronized,访问,lock,剖析,并发,多线程
From: https://blog.51cto.com/u_16351957/8980807

相关文章

  • JavaWeb - Day11 - 案例 - 员工管理、文件上传、修改员工、配置文件
    01.案例-员工管理-新增员工前面我们已经实现了员工信息的条件分页查询以及删除操作。关于员工管理的功能,还有两个需要实现:新增员工修改员工首先我们先完成"新增员工"的功能开发,再完成"修改员工"的功能开发。而在"新增员工"中,需要添加头像,而头像需要用到"文件上传"技......
  • Java,反射创建对象的两种方式
    跟着孙哥学Spring,b站:https://www.bilibili.com/video/BV185411477k/?spm_id_from=333.337.search-card.all.click在Java中,我们可以使用反射来创建对象。这里有两种主要的方式:1.使用Class.forName().newInstance()方法这种方式是使用默认的无参数构造函数来创建对象。如果......
  • Java第十七课_IO流和线程
    1.IO流序列化publicclassPractice01{publicstaticvoidmain(String[]args)throwsIOException,ClassNotFoundException{//一个数据用变量//多个同类型数据用数组//多个不类型数据用对象//多......
  • docker-compose 快速运行java程序
    1、任意目录新建docker-compose.ymltouchdocker-compose.ymlmdkirconfigtouchconfig/application.yml2、复制jar文件到docker-compose.yml所在目录cp3、修改docker-compose.ymlversion:'3'services:qyweixin_server:image:image:harbor.iotwedora.com:4018......
  • Spring提供的实用纯Java工具类合集
    在SpringFramework里的spring-core核心包里面,有个org.springframework.util里面有不少非常实用的工具类。该工具包里面的工具类虽然是被定义在Spring下面的,但是由于Spring框架目前几乎成了JavaEE实际的标准了,因此我们直接使用也是无妨的,很多时候能够大大的提高我们的生产力。I......
  • JavaScript基础语句和window对象
    ifelse语句varsum=190varyouhuisum//赋予一个容器if(sum>=200){youhuisum=sum-10console.log(111)}else{//如果上面if不满足则都执行else语句......
  • 字符流 字节流 多线程
     字符流和字节流:字符流用于处理字符数据,每次读写一个字符,适用于文本文件。字节流用于处理字节数据,适用于二进制文件。InputStream和OutputStream是字节流的基类。Reader和Writer:Reader和Writer是字符流的抽象基类。它们提供了读写字符数据的方法。Output......
  • Java基本结构
    Java基本结构1.顺序结构​ Java的基本结构就是顺序结构,除非特别指明,否则代码就是一行一行执行。2.选择结构if选择结构switch选择结构packagecom.wenxuan.structure;publicclassD1Switch{publicstaticvoidmain(String[]args){//case穿透,如果没有......
  • Java并发(二十一)----wait notify介绍
    1、小故事-为什么需要wait由于条件不满足(没烟干不了活啊,等小M把烟送过来),小南不能继续进行计算但小南如果一直占用着锁,其它人就得一直阻塞,效率太低于是老王单开了一间休息室(调用wait方法),让小南到休息室(WaitSet)等着去了,但这时锁释放开,其它人可以由老王随机安排进屋......
  • JavaScript读写FM1208 CPU卡源码
    本示例使用的发卡器:<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"><head><metahttp-equiv=&quo......