java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java synchronized关键字

Java中的synchronized关键字全解析

作者:我会替风去

synchronized是Java中用于解决并发问题的核心关键字,通过确保多个线程对共享资源的互斥访问,来避免线程安全问题,synchronized具有原子性、可见性、有序性和可重入性等特性,本文给大家介绍Java中的synchronized关键字相关,感兴趣的朋友跟随小编一起看看吧

synchronized是Java中用于解决并发问题的核心关键字,它通过确保多个线程对共享资源的互斥访问,来避免线程安全问题(如竞态条件、数据不一致等)。

synchronized的核心特性

synchronized的使用方式

synchronized的使用灵活,可修饰不同的代码结构,核心是明确“锁对象”——线程竞争的是锁对象,只有获取到锁对象的线程才能执行同步代码,常见使用方式有3种。

synchronized的锁机制

锁优化补充

CAS (Compare And Swap,比较并交换) 是并发编程中实现原子操作的核心算法,是一种乐观锁的实现策略。

ReentrantLock(可重入锁)

两者对比:

特性synchronizedReentrantLock
实现层面JVM 层面(关键字),由 C++ 实现JDK 层面(API),由 Java 编写(基于 AQS)
锁的释放自动释放(代码执行完或异常后)手动释放(必须在 finally 中调用 unlock())
灵活性低(不可中断,无超时机制)高(支持尝试获取、超时获取、可中断获取)
公平性只支持非公平锁支持公平锁与非公平锁(默认非公平)
等待队列只能关联 1 个 等待队列(wait/notify)可以绑定 多个 Condition(精细化唤醒)

ReentrantLock的特有高级功能

基本使用示例:

import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockDemo {
    // 创建非公平锁(默认),若需公平锁:new ReentrantLock(true)
    private static final ReentrantLock lock = new ReentrantLock();
    public static void doTask() {
        // 1. 普通获取锁(不可中断)
        lock.lock();
        try {
            // 临界区代码(线程安全)
            System.out.println(Thread.currentThread().getName() + " 执行任务");
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        } finally {
            // 必须在finally中释放锁,否则锁永远无法释放
            lock.unlock();
        }
    }
    // 超时获取锁示例
    public static void tryLockWithTimeout() {
        try {
            // 尝试在2秒内获取锁,获取成功返回true,失败返回false
            if (lock.tryLock(2, java.util.concurrent.TimeUnit.SECONDS)) {
                try {
                    System.out.println(Thread.currentThread().getName() + " 超时获取锁成功");
                } finally {
                    lock.unlock();
                }
            } else {
                System.out.println(Thread.currentThread().getName() + " 超时获取锁失败");
            }
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
    public static void main(String[] args) {
        // 测试普通获取锁
        new Thread(ReentrantLockDemo::doTask, "线程1").start();
        new Thread(ReentrantLockDemo::doTask, "线程2").start();
        // 测试超时获取锁
        new Thread(ReentrantLockDemo::tryLockWithTimeout, "线程3").start();
    }
}

到此这篇关于Java中的synchronized关键字全解析的文章就介绍到这了,更多相关java synchronized关键字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文