2024 Java 高分面试宝典 一站式搞定技术面&项目面【官方同步】

乌进孝
• 阅读 11

百度爱学it学无止境 Java锁技术详解 在Java多线程编程中,锁是控制多个线程对共享资源访问的关键机制。合理地使用锁可以确保数据的一致性和线程安全,提高程序的并发性能。本文将深入探讨Java中几种常见的锁类型及其实现方式,并通过示例代码进行说明。

一、Java锁的分类 Java中的锁可以按照不同的维度进行分类,主要包括以下几种:

悲观锁与乐观锁 悲观锁:认为冲突总是会发生,因此在访问共享资源之前先加锁。Java中的synchronized关键字和ReentrantLock类都是悲观锁的实现。 乐观锁:认为冲突很少发生,因此只在数据更新时检查是否发生了冲突。乐观锁通常通过版本号机制或CAS(Compare-And-Swap)算法实现。 公平锁与非公平锁 公平锁:按照线程请求锁的顺序来分配锁,即先请求锁的线程将先获得锁。 非公平锁:不保证锁分配的公平性,允许插队现象。ReentrantLock类默认是非公平锁,但可以通过构造函数设置为公平锁。 独占锁与共享锁 独占锁:只允许一个线程持有锁,如ReentrantLock。 共享锁:允许多个线程同时读取共享资源,但写入时需要独占访问,如ReadWriteLock。 偏向锁、轻量级锁与重量级锁 偏向锁:通过标记线程是否已获得锁,来减少加锁和解锁的开销,适用于只有一个线程访问的场景。 轻量级锁:使用CAS算法尝试加锁,如果成功则避免使用重量级锁的开销。 重量级锁:如果轻量级锁失败,则升级为重量级锁,通过系统级别的锁机制来保证线程安全。 二、示例代码

  1. 悲观锁(synchronized) java public class Counter {
    private int count = 0;

    public synchronized void increment() {

     count++;  

    }

    public synchronized int getCount() {

     return count;  

    }
    } 在这个例子中,synchronized关键字确保了increment和getCount方法的线程安全。

  2. 乐观锁(CAS实现) java import java.util.concurrent.atomic.AtomicInteger;

public class OptimisticCounter {
private AtomicInteger count = new AtomicInteger(0);

public void increment() {  
    while (true) {  
        int current = count.get();  
        int next = current + 1;  
        if (count.compareAndSet(current, next)) {  
            break;  
        }  
        // 如果有其他线程修改了count,则重试  
    }  
}  

public int getCount() {  
    return count.get();  
}  

} 这里使用了AtomicInteger的compareAndSet方法来实现乐观锁,通过循环检查并更新值来确保线程安全。

  1. 读写锁(ReentrantReadWriteLock) java import java.util.concurrent.locks.ReadWriteLock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;

public class Cache {
private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private final Map<String, Object> cache = new HashMap<>();

public void put(String key, Object value) {  
    readWriteLock.writeLock().lock();  
    try {  
        cache.put(key, value);  
    } finally {  
        readWriteLock.writeLock().unlock();  
    }  
}  

public Object get(String key) {  
    readWriteLock.readLock().lock();  
    try {  
        return cache.get(key);  
    } finally {  
        readWriteLock.readLock().unlock();  
    }  
}  

} 在这个例子中,使用ReentrantReadWriteLock来控制对缓存的读写访问,提高了并发性能。

三、总结 Java中的锁机制是多线程编程中不可或缺的一部分。通过合理地选择和使用不同类型的锁,可以确保数据的一致性和线程安全,同时提高程序的并发性能。悲观锁和乐观锁、公平锁和非公平锁、独占锁和共享锁等不同类型的锁各有其适用场景,开发者应根据具体需求进行选择。

以上内容简要介绍了Java中几种常见的锁类型及其实现方式,并通过示例代码进行了说明。希望本文能对Java多线程编程中的锁机制有更深入的理解。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
java多线程之ReentrantLock
前言相信学过java的人都知道synchronized这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么实现的。如果真是这样,而且你有兴趣了解,今天我将带领你轻松的学习下java中非常重要,也非常基础的可重入锁ReentrantLock的实现机制。R
Wesley13 Wesley13
2年前
java 多线程总结篇4——锁机制
在开发Java多线程应用程序中,各个线程之间由于要共享资源,必须用到锁机制。Java提供了多种多线程锁机制的实现方式,常见的有synchronized、ReentrantLock、Semaphore、AtomicInteger等。每种机制都有优缺点与各自的适用场景,必须熟练掌握他们的特点才能在Java多线程应用开发时得心应手。——《Java锁机制详解》(
Wesley13 Wesley13
2年前
Java 之 synchronized 详解
一、概念synchronized是Java中的关键字,是利用锁的机制来实现同步的。锁机制有如下两种特性:互斥性:即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程中的协调机制,这样在同一时间只有一个线程对需同步的代码块(复合操作)进行访问。互斥性我们也往往称为操作的原子性。可见性:必须确
Wesley13 Wesley13
2年前
Java多线程优化
\以下文章来源于51CTO技术栈 ,作者崔皓今天,我们从Java内部锁优化,代码中的锁优化,以及线程池优化几个方面展开讨论。Java 内部锁优化当使用Java多线程访问共享资源的时候,会出现竞态的现象。即随着时间的变化,多线程“写”共享资源的最终结果会有所不同。为了解决这个问题,让多线程“写”资源的时候有先后顺序,引入
Wesley13 Wesley13
2年前
Java多线程synchronized关键字引出的多种锁
前言Java中的 synchronized关键字可以在多线程环境下用来作为线程安全的同步锁。本文不讨论 synchronized 的具体使用,而是研究下synchronized底层的锁机制,以及这些锁分别的优缺点。一、synchronized机制synchro
Stella981 Stella981
2年前
ReentrantReadWriteLock实现原理
  在java并发包java.util.concurrent中,除了重入锁ReentrantLock外,读写锁ReentrantReadWriteLock也很常用。在实际开发场景中,在使用共享资源时,可能读操作远远多于写操作。这种情况下,如果对这部分共享资源能够让多个线程读的时候不受阻塞,仅仅在写的时候保证安全性,这样效率会得到显著提升。读写锁Reentra
观音菩萨 观音菩萨
1星期前
2024 Java 高分面试宝典 一站式搞定技术面&项目面
2024Java高分面试宝典一站式搞定技术面&项目面Java高分面试宝典的技巧当准备面试时,以下是一些在Java领域中帮助你获得高分的技巧和建议:深入理解核心概念:确保你对Java语言的核心概念(如面向对象、多线程、集合框架、异常处理、IO操作等)有深入的
银蝶 银蝶
3天前
2024 Java 高分面试宝典 一站式搞定技术面&项目面(完结)
2024Java高分面试宝典一站式搞定技术面&项目面图片水印获课:想要面试成功,掌握jave必备的核心知识必不可少Java作为一种广泛使用的编程语言,有一些核心的知识点是每个Java开发者都应该掌握的。以下是一些必备的核心知识:一、面向对象编程(OOP):