Java中锁的类型

什么是Java中的锁?Java中的锁有哪些类型? 在Java编程中,锁是一种同步机制,用于确保多个线程在访问共享资源时的一致性和正确性。它可以避免因多线程同时读写数据而导致的数据不一致问题。 阅读详情

按照锁的特性分类

公平性分类

公平锁(Fair lock)

公平锁指多个线程按照申请锁的顺序依次获取锁,遵循先到先得的原则,避免线程饥饿现象。在Java中,公平锁通常通过ReentrantLock或ReentrantReadWriteLock的构造函数指定公平策略实现。

  1. ReentrantLock的公平模式
    通过构造函数传入true启用公平锁:

    ReentrantLock fairLock = new ReentrantLock(true); // true表示公平锁
    

    公平锁会维护一个线程等待队列,按请求顺序分配锁,但性能略低于非公平锁。

  2. ReentrantReadWriteLock的公平模式
    类似ReentrantLock,通过构造函数指定公平性:

    ReentrantReadWriteLock fairReadWriteLock = new ReentrantReadWriteLock(true);
    

    读写锁的公平模式下,读锁和写锁的分配均遵循请求顺序。

  3. Semaphore的公平模式
    信号量也可通过构造函数启用公平策略:

    Semaphore fairSemaphore = new Semaphore(permits, true); // true表示公平
    

    公平模式下,线程按申请许可证的顺序获取资源。

注意事项
  • 性能权衡:公平锁减少线程饥饿但增加上下文切换开销,非公平锁吞吐量更高。
  • 默认行为:ReentrantLock和Semaphore默认是非公平锁,需显式声明公平策略。
  • 适用场景:严格顺序需求或避免饥饿时使用公平锁,高并发场景优先考虑非公平锁。
示例代码
// 公平锁示例
ReentrantLock lock = new ReentrantLock(true);
lock.lock();
try {
    // 临界区代码
} finally {
    lock.unlock();
}

非公平锁(Non-fair-lock)

它不保证线程获取锁的顺序与请求锁的顺序一致。线程可以在锁被释放时直接尝试获取锁,而不考虑是否有其他线程已经在等待队列中。

实现方式

在Java中,ReentrantLock类默认使用非公平锁策略。可以通过以下代码显式创建非公平锁:

ReentrantLock lock = new ReentrantLock(false); // false表示非公平锁

特点

非公平锁允许新请求锁的线程插队,即使有其他线程在等待队列中。这种机制减少了线程切换的开销,提高了吞吐量,但可能导致某些线程长时间无法获取锁。

优点

  • 减少线程切换,提高性能
  • 在高并发场景下吞吐量更高

缺点

  • 可能导致某些线程饥饿
  • 无法保证公平性
使用场景
  • 锁持有时间较短
  • 线程竞争不激烈
  • 对吞吐量要求高于公平性要求
与公平锁的对比
// 非公平锁
ReentrantLock nonFairLock = new ReentrantLock(false);

// 公平锁
ReentrantLock fairLock = new ReentrantLock(true);

非公平锁的性能通常优于公平锁,因为减少了线程切换的开销。但在要求严格的公平性场景下,应该使用公平锁。

非公平锁的底层实现

非公平锁通过AQS(AbstractQueuedSynchronizer)实现。当线程尝试获取锁时,会先尝试直接获取,失败后才进入等待队列:

final boolean nonfairTryAcquire(int acquires) {
    final Thread current = Thread.currentThread();
    int c = getState();
    if (c == 0) {
        if (compareAndSetState(0, acquires)) {
            setExclusiveOwnerThread(current);
            return true;
        }
    }
    else if (current == getExclusiveOwnerThread()) {
        int nextc = c + acquires;
        if (nextc < 0) // overflow
            throw new Error("Maximum lock count exceeded");
        setState(nextc);
        return true;
    }
    return false;
}

排他性分类

独占锁(Exclusive lock)

独占锁(Exclusive Lock)是一种同步机制,同一时间只允许一个线程持有锁,其他线程必须等待锁释放后才能获取。Java 中主要通过 synchronized 关键字和 ReentrantLock 类实现独占锁。


使用 synchronized 实现独占锁

synchronized 是 Java 内置的独占锁机制,可以修饰方法或代码块。

方法级别锁

public synchronized void exclusiveMethod() {
    // 临界区代码
}

代码块级别锁

public void exclusiveBlock() {
    synchronized (this) {
        // 临界区代码
    }
}

特点

  • 自动释放锁:线程执行完同步代码或发生异常时,锁会自动释放。
  • 可重入性:同一线程可重复获取已持有的锁。

使用 ReentrantLock 实现独占锁

ReentrantLock 是 java.util.concurrent.locks 包下的显式锁实现,提供更灵活的锁控制。

基本用法

private final ReentrantLock lock = new ReentrantLock();

public void performTask() {
    lock.lock(); // 获取锁
    try {
        // 临界区代码
    } finally {
        lock.unlock(); // 确保锁释放
    }
}

高级功能

  1. 可中断锁
    lock.lockInterruptibly(); // 响应中断的锁获取
    

  2. 尝试获取锁
    if (lock.tryLock(1, TimeUnit.SECONDS)) { // 尝试在指定时间内获取锁
        try {
            // 临界区代码
        } finally {
            lock.unlock();
        }
    }
    

  3. 公平锁
    ReentrantLock fairLock = new ReentrantLock(true); // 公平锁
    


应用场景
  1. 资源互斥访问
    如单例模式的双重检查锁、共享变量的线程安全操作。
  2. 写操作保护
    在读写锁(ReadWriteLock)中,写锁是独占锁,确保写操作原子性。

注意事项
  • 避免死锁:确保锁的获取和释放成对出现,尤其是异常场景。
  • 性能考量:高并发场景下,ReentrantLock 的灵活性可能优于 synchronized,但需手动管理锁释放。

通过合理选择 synchronized 或 ReentrantLock,可以高效实现线程安全的独占访问控制。

共享锁 (Shared lock)

共享锁(Shared Lock)是一种允许多个线程同时读取资源,但禁止写入的锁机制。与排他锁(Exclusive Lock)互斥的特性不同,共享锁适用于读多写少的场景,能有效提高并发性能。

Java中主要通过ReadWriteLock接口及其实现类ReentrantReadWriteLock实现共享锁:

  • 读锁(共享锁):通过readLock()方法获取,允许多个线程同时持有。
  • 写锁(排他锁):通过writeLock()方法获取,同一时间仅允许一个线程持有。
ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
ReentrantReadWriteLock.ReadLock readLock = rwLock.readLock(); // 共享锁
ReentrantReadWriteLock.WriteLock writeLock = rwLock.writeLock(); // 排他锁

使用场景

  1. 缓存系统:多个线程可并发读取缓存数据,写入时需独占。
  2. 资源池管理:如数据库连接池的读取操作。
// 示例:使用共享锁实现线程安全的缓存
class Cache<K, V> {
    private final Map<K, V> map = new HashMap<>();
    private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();

    public V get(K key) {
        rwLock.readLock().lock();
        try {
            return map.get(key);
        } finally {
            rwLock.readLock().unlock();
        }
    }

    public void put(K key, V value) {
        rwLock.writeLock().lock();
        try {
            map.put(key, value);
        } finally {
            rwLock.writeLock().unlock();
        }
    }
}

注意事项

  • 锁升级问题:持有读锁时尝试获取写锁会导致死锁,需先释放读锁。
  • 公平性选择:ReentrantReadWriteLock支持公平/非公平模式,非公平模式吞吐量更高。

共享锁与同步代码块的对比

特性共享锁(ReadWriteLock)synchronized
并发性读操作并发,写操作互斥完全互斥
灵活性可分离读/写锁单一锁机制

其他共享锁实现

  • StampedLock:Java 8引入,支持乐观读锁,适用于读操作远多于写的场景。
StampedLock stampedLock = new StampedLock();
long stamp = stampedLock.tryOptimisticRead(); // 乐观读锁
if (!stampedLock.validate(stamp)) {
    stamp = stampedLock.readLock(); // 退化为悲观读锁
}

获取方式分类

悲观锁(Pessimistic lock)

悲观锁是一种并发控制机制,假设多线程并发访问共享资源时大概率会发生冲突,因此在访问数据前会先加锁,确保其他线程无法同时修改。适用于写操作频繁的场景。


实现方式

synchronized 关键字

通过synchronized修饰方法或代码块,实现隐式锁:

public synchronized void updateData() {
    // 临界区代码
}

或使用代码块锁定特定对象:

public void updateData() {
    synchronized (this) { // 锁住当前对象
        // 临界区代码
    }
}

ReentrantLock

java.util.concurrent.locks.ReentrantLock提供更灵活的显式锁:

private final ReentrantLock lock = new ReentrantLock();

public void updateData() {
    lock.lock(); // 手动加锁
    try {
        // 临界区代码
    } finally {
        lock.unlock(); // 必须手动释放
    }
}


数据库悲观锁

在JDBC中可通过SQL语句实现:

  • SELECT ... FOR UPDATE(MySQL/Oracle):
Connection conn = ...;
try {
    conn.setAutoCommit(false);
    PreparedStatement ps = conn.prepareStatement(
        "SELECT * FROM accounts WHERE id = ? FOR UPDATE"
    );
    ps.setInt(1, accountId);
    ResultSet rs = ps.executeQuery();
    // 修改数据后提交
    conn.commit();
} catch (SQLException e) {
    conn.rollback();
}


注意事项

  • 死锁风险:多个线程互相持有对方所需锁时会导致死锁,需设计合理的加锁顺序。
  • 性能开销:频繁加锁可能降低系统吞吐量,读多写少的场景建议考虑乐观锁。
  • 锁粒度:尽量缩小锁范围(如锁定行而非整表)以减少阻塞。

适用场景

  • 数据竞争激烈的写操作。
  • 需要保证强一致性的业务逻辑(如支付系统扣款)。

乐观锁 (Optimistic lock)

乐观锁是一种并发控制机制,假设多线程操作共享资源时不会发生冲突,因此在操作前不加锁,而是在提交更新时检查资源是否被其他线程修改。如果未被修改,则提交成功;否则,根据策略(重试、报错等)处理冲突。乐观锁适用于读多写少的场景,减少锁竞争的开销。

乐观锁的实现方式

1. 版本号机制
在数据表中增加一个版本号字段(如 version),每次更新时比对版本号。若版本号匹配,则更新数据并递增版本号;否则视为冲突。

示例代码(基于数据库)

// 假设有一个实体类
public class Product {
    private Long id;
    private String name;
    private int version; // 乐观锁版本号
}

// 更新逻辑
@Transactional
public void updateProduct(Long id, String newName) {
    Product product = productDao.selectById(id);
    product.setName(newName);
    int updated = productDao.updateWithVersion(product);
    if (updated == 0) {
        throw new OptimisticLockException("更新失败,数据已被修改");
    }
}

对应的 SQL 语句示例:

UPDATE product SET name = #{newName}, version = version + 1 
WHERE id = #{id} AND version = #{oldVersion};

2. CAS(Compare-And-Swap)
通过原子操作(如 AtomicInteger)实现乐观锁,适用于单机或多线程环境。

示例代码(基于 AtomicInteger)

private AtomicInteger counter = new AtomicInteger(0);

public void increment() {
    int oldValue, newValue;
    do {
        oldValue = counter.get();
        newValue = oldValue + 1;
    } while (!counter.compareAndSet(oldValue, newValue));
}

优点

  • 无锁竞争,提高吞吐量。
  • 避免死锁问题。

缺点

  • 冲突频繁时需重试,可能降低性能。
  • 不保证操作原子性,需结合事务或其他机制。

适用场景

  • 读多写少的高并发场景(如商品库存、点赞计数)。
  • 冲突概率较低的业务逻辑。

注意事项

  • 版本号需为整型或时间戳,确保可比较性。
  • 分布式环境中需结合分布式锁或数据库唯一约束。

状态分类

可重入锁 (Reentrant lock)

可重入锁(ReentrantLock)是Java中一种显式锁机制,属于java.util.concurrent.locks包。与synchronized关键字相比,它提供更灵活的锁操作,支持公平锁、非公平锁、可中断锁等待等特性。


核心特性

  1. 可重入性
    同一线程可以多次获取同一把锁,避免死锁。每次获取锁后需对应释放,通常通过计数器实现。

  2. 公平性选择
    通过构造函数指定公平锁(fair=true)或非公平锁(默认)。公平锁按请求顺序分配,非公平锁允许插队。

  3. 条件变量(Condition)
    通过newCondition()创建多个条件队列,实现精细化的线程等待/唤醒机制,类似wait()和notify()。


基本用法

ReentrantLock lock = new ReentrantLock(); // 非公平锁
lock.lock(); // 获取锁
try {
    // 临界区代码
} finally {
    lock.unlock(); // 确保锁释放
}


高级功能

1. 尝试获取锁
  • tryLock():立即返回是否成功获取锁。
  • tryLock(long timeout, TimeUnit unit):在指定时间内尝试获取锁。
if (lock.tryLock(1, TimeUnit.SECONDS)) {
    try {
        // 操作临界区
    } finally {
        lock.unlock();
    }
} else {
    // 处理超时逻辑
}

2. 可中断锁

lockInterruptibly()允许在等待锁时响应中断,避免死等。

try {
    lock.lockInterruptibly();
    // 临界区代码
} catch (InterruptedException e) {
    Thread.currentThread().interrupt(); // 恢复中断状态
} finally {
    if (lock.isHeldByCurrentThread()) {
        lock.unlock();
    }
}

3. 公平锁示例
ReentrantLock fairLock = new ReentrantLock(true); // 公平锁
fairLock.lock();
try {
    // 公平锁保护的代码
} finally {
    fairLock.unlock();
}


与synchronized对比

特性ReentrantLocksynchronized
锁获取方式显式调用lock()/unlock()隐式(代码块/方法)
公平性支持配置非公平
可中断支持不支持
条件变量支持多个Condition单一wait()/notify()
性能高竞争时更优低竞争时更优

注意事项

  • 必须在finally块中释放锁,避免异常导致锁泄漏。
  • 避免嵌套过多锁操作,可能导致逻辑复杂化。
  • 公平锁可能降低吞吐量,需根据场景权衡。

通过合理使用ReentrantLock,可以更灵活地控制多线程并发,尤其适用于需要复杂同步策略的场景。

不可重入锁 (Non-reentrant lock)

不可重入锁(Non-Reentrant Lock)是一种线程同步机制,特点是同一线程在持有锁的情况下,若再次尝试获取该锁,会导致线程阻塞或死锁。与可重入锁(如 ReentrantLock)不同,不可重入锁不记录持有线程的重复获取次数。

不可重入锁通常通过以下方式实现:

  • 锁状态标记:使用一个布尔变量(如 isLocked)表示锁是否被占用。
  • 线程检查:获取锁时,若锁已被占用(无论是否当前线程持有),均会阻塞。

以下是一个简单的不可重入锁实现示例:

public class NonReentrantLock {
    private boolean isLocked = false;

    public synchronized void lock() throws InterruptedException {
        while (isLocked) {
            wait(); // 若锁被占用,当前线程等待
        }
        isLocked = true; // 获取锁
    }

    public synchronized void unlock() {
        isLocked = false;
        notify(); // 唤醒等待线程
    }
}

不可重入锁的问题

  1. 死锁风险:若线程在持有锁时重复调用 lock(),会导致自身阻塞。
    NonReentrantLock lock = new NonReentrantLock();
    lock.lock();
    lock.lock(); // 线程在此处永久阻塞
    

  2. 灵活性不足:无法支持递归调用或嵌套同步代码块。

应用场景

  • 简单同步需求:仅需基础互斥且无嵌套锁的场景。
  • 资源限制:明确要求防止同一线程重复获取锁的情况。

不可重入锁与可重入锁的对比

特性不可重入锁可重入锁(如 ReentrantLock)
同一线程重复获取导致阻塞/死锁允许,记录重入次数
实现复杂度简单需维护持有线程和计数器
适用场景无嵌套锁的简单同步递归调用或复杂同步逻辑

注意事项

  • 避免在不可重入锁保护的代码中调用可能再次获取锁的方法。
  • 若需嵌套锁,应使用 ReentrantLock 或 synchronized(Java 内置的可重入锁)。
java 有哪些类型的锁 阅读详情

相关推荐

Java并发编程(14)—— Java中的公平锁和非公平锁

在Synchronized中,当一个线程释放锁时,JVM会从等待队列中随机选择一个线程来获取锁,而不是按照申请锁的顺序来获取锁,因此Synchronized是一种非公平锁。在并发环境中,每一个线程在获取锁时会先查看此锁维护的等待队列,如果为空,或者当前线程是等待队列的第一个就占有锁,否者就会加入到等待队列中,以后会按照 FIFO 的规则获取锁。Synchronized是Java中内置的锁机制,它的锁模式是非公平锁,这是因为Synchronized的实现方式是基于对象监视器(monitor)的。

shangjg3的博客 1302

Java公平锁

Java公平锁

m0_46580493的博客 401

接入 deepseek 实现AI智能问诊

必须包含user角色,用于传递用户输入。system角色可选,用于设置对话背景。多轮对话需要将历史记录添加到messages中。

weixin_51326478的博客 6541

【Java常见锁(公平锁、非公平锁、可重入锁、自旋锁、独占锁、共享锁)】

Java常见锁(公平锁、非公平锁、可重入锁、自旋锁、独占锁、共享锁)

weixin_46356409的博客 1661

KBS投稿全流程拆解:从模板准备到条件接收的实战指南

本文详细拆解了KBS期刊投稿的全流程,从模板准备、投稿系统操作到返修策略和条件接收。重点介绍了Cover Letter撰写技巧、Latex模板选择、审稿周期管理以及返修文件的系统准备方法,帮助研究者高效完成KBS投稿并提升接收概率。

weixin_26938645的博客 703

AI Agent核心架构解析:从Tool、Skill到MCP协议的智能体构建实战

在人工智能领域,大语言模型(LLM)赋予了AI自主规划与决策的能力,推动了智能体(Agent)技术的演进。其核心原理在于构建一个具备感知、规划、行动与反思能力的自主系统。这一架构的技术价值在于将AI从被动应答升级为主动执行复杂任务的工作伙伴,显著提升了自动化水平与问题解决效率。应用场景广泛覆盖了市场分析、自动化办公、智能客服与垂直领域集成等。本文聚焦于实现这一能力的关键组件:基础工具(Tool)、组合技能(Skill)与标准化协议(MCP)。其中,Skill通过封装多个Tool形成可复用的高级能力,而MCP

chuannaoxuan4674的博客 318

Java基础知识之锁机制

可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。 1.3、独享锁/共享锁: 独享锁是指该锁一次只能被一个线程所持有。 共享锁是指该锁可被多个线程所持有。上面讲的独享锁/共享锁就是一种广义的说法,互斥锁/读写锁就是具体的实现。乐观锁与悲观锁不是指具体的什么类型的锁,而是指看待并发同步的角度。从上面的描述我们可以看出,悲观锁适合写操作非常多的场景,乐观锁适合读操作非常多的场景,不加锁会带来大量的性能提升。 悲观锁在Java中的使用,就是利用各种锁。 乐观锁在Java中的使

qq_45698181的博客 882

超实用!VS Code配置C/C++开发环境全攻略

本文提供了一份详细的VS Code配置C/C++开发环境全攻略。从MinGW-w64编译器的选择与安装,到VS Code核心扩展的配置,再到tasks.json构建任务与launch.json调试环境的设置,手把手指导初学者完成从环境搭建到高效开发与调试的全过程,帮助开发者快速上手C/C++项目。

weixin_28829479的博客 184

Java进阶篇--公平锁 & 非公平锁

Java进阶篇--公平锁 & 非公平锁

m0_74293254的博客 4428

[附源码]计算机毕业设计Python财务管理系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程项目运行环境配置:Pychram社区版+py项目技术:django + python+ Vue 等等组成,B/S模式 +pychram管理等等。环境需要1.运行环境:最好是python3.7.7,我们在这个版本上开发的。其他版本理论上也可以。2.pycharm环境:pycharm都可以。推荐pycharm社区版;3.mysql环境:建议是用5.7版本均可。

巧灵计算机程序设计 1067

【Win10/11】Windows电脑WiFi显示小地球/断网的解决方法 Windows WiFi小地球、网络连接中断、网络重置、无线网卡驱动、Win10/Win11网络修复

最近经常有粉丝留言问我,Windows 电脑突然连不上 WiFi,右下角网络图标显示成了“小地球 🌐”,或者干脆提示“未连接 - 没有可用的连接”。明明其他设备网络都正常,唯独自己的电脑断了。作为在互联网大厂混迹多年的前端程序员,我自己也碰到过这个问题。总结几种比较常见、亲测有效的解决方法,写出来供大家参考,希望能帮你快速恢复上网!问题原因推荐解决方法系统设置错乱使用网络重置功能驱动异常或冲突卸载后重启自动安装驱动驱动版本过旧手动更新网卡驱动实在不行考虑使用系统还原点或重装系统这几个方法中,

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 3846

Java 锁类型总结

专栏原创出处:github-源笔记文件 ,github-源码 ,转载请附上原文出处链接和本声明。 锁类型总结 关于锁的知识点参考《锁的内存语义》《并发同步、锁定机制比较》文章 Java 锁的分类没有严格意义的规则,我们常说的分类一般都是依据锁的特性、锁的设计、锁的状态等进行归纳整理。 乐观锁、悲观锁 自旋锁、适应性自旋锁 无锁、偏向锁、轻量级锁、重量级锁 公平锁、非公平锁 可重入锁、非...

2.wa 727

【AUTOSAR-E2E】-1.4-详述E2E Transformer解决方案

共13页精讲 目录 1“Data Transformation”介绍 1.1 基于SOME/IP Transformer 1.2 基于COM Based Transformer 2 ComXf(COM Based Transformer)介绍 2.1 ComXf(COM Based Transformer)功能规范 2.2 ComXf(COM Based Transformer)提供的服务 2.3 配置注意事项 3 E2EXf(E2E Transformer)介绍 3.1 E2EX...

「汽车电子助手」的博客 4700

java常见的锁的类型

每个线程在获取锁时会先查看此锁维护的等待队列,如果为空或当前线程是等待队列的第一个,就占有锁,否则就加入到等待队列中,以后会FIFO的规则来从队列获取锁ReentrantLock的创建可以指定构造函数的boolean类型来指定得到公平锁或非公平锁,如果不写默认是false-非公平锁。读写锁的内部包含两把锁:一把是读(操作)锁,是一种共享锁;指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码,在同一个线程在外层方法获取锁的时候,在内层方法会自动获取锁。非公平锁吞吐量比较大。

m0_37635053的博客 921

Python爬虫实战:如何抓取POI信息(公共场所)位置信息

获取公共场所的信息:如餐厅、商店、医院、景点等。抓取POI的基本信息:如名称、类别、地址、评分等。获取POI的地理坐标:经度和纬度信息。存储POI数据:将抓取到的POI信息存储到本地数据库中。通过本篇文章,我们详细介绍了如何使用Python爬虫抓取POI信息。通过Google Maps API和OpenStreetMap(Overpass API),我们展示了如何获取餐厅、商店、医院等公共场所的位置信息,并进一步探讨了如何处理分页、存储数据以及反爬虫策略。

2201_76125261的博客 378

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java锁类型

Java锁类型

qq_43668086的博客 2175

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java知识点_锁的类型有哪些?

记得面试的时候总是被问及一些java相关锁的问题,其中最常被问及的就是:锁的类型都用哪些?这篇文章主要记录常用的一些类型,以备面试中问道。

FDoubleman的博客 1682

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java 各种锁类型介绍

Java 锁 1. 乐观锁 ​ 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为 别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新), 如果失败则要重复读-比较-写的操作。 java 中的乐观锁基本都是通过 CAS 操作实现的,CAS 是一种更新的原子操作,比较当前值跟传入 值是否一样,一样则更新,否则失败。 2. 悲观锁 ​ 悲观锁是就是悲观思想,即

qq_42499581的博客 1645

java 锁 类型_Java中的锁分类

在读很多并发文章中,会提及各种各样锁如公平锁,悲观锁等等,这篇文章引见各种锁的分类。引见的内容如下:公平锁/非公平锁可重入锁独享锁/共享锁互斥锁/读写锁悲观锁/悲观锁分段锁倾向锁/轻量级锁/重量级锁自旋锁上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词停止一定的解释。公平锁/非公平锁公平锁是指多个线程依照申请锁的次第来获取锁。非公平锁...

weixin_39790738的博客 104

Java 锁的使用与锁的类型

1 概念 1.1 线程安全 指在并发的情况之下,该代码经过多线程使用,线程的调度顺序不影响任何结果。这个时候使用多线程,我们只需要关注系统的内存、cpu是不是够用即可。反过来,线程不安全就意味着线程的调度顺序会影响最终结果,如不加事务的转账代码: void transferMoney(User from, User to, float amount){ to.setMoney(to.getBal...

Xu_JL1997的博客 1495

Java中Java对象结构和各种类型锁的理解

JAVA中的引用的内存分配大小是多少?如,我声明了一个对象,它在栈中就先有了个空间,(用来放地址引用的),这个空间的大小是多少?java规范中并没有强行定义虚拟机中任何一种类型在虚拟机中所占用内存的具体大小,但是规范规定了每种类型的取值范围。从这种角度上看,每种类型会有一个最小位宽,或者内存占用大小。而且java虚拟机规定中,在方法区中所占用的内存大小与在栈帧所占用的内存大小不同,因为 在方法区中占用内存以字节为最小单位,但是在战帧中以字为最小单位。如byte。

pingguocu3的博客 1016

java中为什么使用锁,常见的锁的类型

Java锁(Java Locks)是Java编程语言中用于实现多线程同步和互斥的机制。在并发编程中,多线程同时访问共享资源可能导致竞态条件(Race Condition)和其他并发问题,Java锁提供了一种控制多线程并发访问的方式,以确保线程安全(Thread Safety)和正确的数据访问。在Java多线程编程中起着重要的作用。Java提供了多种类型的锁,如synchronized关键字、ReentrantLock类、Read/Write Locks等,以满足不同场景下的并发控制需求。

2301_79434102的博客 302

java 变量锁类型的区别_说说java锁有哪些种类,以及区别

展开全部锁作为并发共享数据,保证一62616964757a686964616fe59b9ee7ad9431333339666133致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及。本系列文章将分析JAVA下常见的锁名称以及特性,为大家答疑解惑。1、自旋锁自旋锁...

weixin_39814925的博客 113

Java中锁类型和synchronized原理,由浅入深

理解锁的基础知识 如果想要透彻的理解java锁的来龙去脉,需要先了解以下基础知识。 基础知识之一:锁的类型 按照其性质分类 公平锁/非公平锁 公平锁是指多个线程按照申请锁的顺序来获取锁。非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。对于Java ReentrantLock而言,通过构造函数指定该锁是否是公平锁,默认是非公平锁。非公平锁的优点在于吞吐量比公平锁大。对于Synchronized而言,也是一种非公

weixin_44060526的博客 571

Java中的锁的类型

可重入锁:当前线程获取到锁,当需要再次获取相同锁的时候是可以直接获取的,内部有个计数器,每获取一次计数器+1,释放一次计数器-1,当计数器为0的时候表示当前锁没有人获取不可重入锁:当前线程获取到锁,当需要再次获取相同锁的时候是不可以获取到的,必须要先释放锁,然后在获取锁。

Blizzard_Warlock的博客 353
上一篇: java 内存交互模型-JMM
下一篇: Redis 为什么那么快
programer_33
博客等级 码龄9年 49粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值