墨风如雪博客

  • 源码小店
  • 导航站
  • 登录
  • java
  • 资源分享
让AI使用变得如此简单
  1. 首页
  2. java
  3. 正文

Java线程同步和锁机制:synchronized和Lock

2023年 5月 2日 165点热度 0人点赞 0条评论

线程同步和锁机制

线程同步是指多个线程对共用的资源的访问是有次序的,同一时间只允许一个线程对共享资源进行访问。锁机制是同步其他线程对共享资源的访问。

synchronized的基本概念

synchronized是Java中最基本的锁定机制,通过控制对象的锁状态来实现多线程的同步。它的语法格式包括两种:

  1. 修饰方法,形式为:synchronized void method(){}
  2. 修饰代码块,形式为:
synchronized(lock){
    // synchronized block statements
}

其中,lock是锁定的对象,synchronized保证锁定的代码同一时刻只有一个线程执行。

Lock的基本概念

Lock是Java提供的一种更灵活、更强大的锁机制,它比synchronized多了很多高级特性,主要有以下优点:

  1. 可中断的锁获取
  2. 可限时的锁获取
  3. 多个条件变量

在使用Lock时,需要手动获取锁和释放锁,即在try-finally语句块中获取锁并在finally语句块中释放锁。

下面是Lock的基本使用示例:

Lock lock = new ReentrantLock();

lock.lock();
try {
    // protected code
}
finally {
    lock.unlock();
}

synchronized和Lock的区别

  1. synchronized是Java内置的锁机制,而Lock是Java API提供的锁机制。
  2. synchronized在锁的使用和释放上比较简单,而Lock必须手动获取和释放。
  3. Lock支持更多特性,比如多个条件变量。

在多线程并发的场景中,如果只是简单的同步控制,使用synchronized就足够了。如果需要更复杂的锁机制,比如可中断锁、可限时锁、多个条件变量等,Lock会更加灵活。

synchronized和Lock的应用场景

synchronized适用于简单的并发场景,比如对一个共享变量的读写操作,或者在需要同步控制的方法上使用。synchronized还可以适用于一些比较简单的等待策略。

而Lock适用于使用更复杂锁机制场景,比如可中断锁、可限时锁、多个条件变量等。

代码示例

下面的代码演示了利用synchronized实现对共享变量的同步控制:

class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

class CounterThread extends Thread {
    private Counter counter;

    public CounterThread(Counter counter) {
        this.counter = counter;
    }

    public void run() {
        for (int i = 0; i < 1000; i++) {
            counter.increment();
        }
    }
}

public class Main {

    public static void main(String[] args) throws InterruptedException {
        Counter counter = new Counter();

        Thread thread1 = new CounterThread(counter);
        Thread thread2 = new CounterThread(counter);

        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();

        System.out.println(counter.getCount());
    }
}

下面的代码演示了利用Lock实现对共享变量的同步控制:

class Counter {
    private int count = 0;

    private Lock lock = new ReentrantLock();

    public void increment() {
        lock.lock();
        try {
            count++;
        }
        finally {
            lock.unlock();
        }
    }

    public int getCount() {
        lock.lock();
        try {
            return count;
        }
        finally {
            lock.unlock();
        }
    }
}

class CounterThread extends Thread {
    private Counter counter;

    public CounterThread(Counter counter) {
        this.counter = counter;
    }

    public void run() {
        for (int i = 0; i < 1000; i++) {
            counter.increment();
        }
    }
}

public class Main {

    public static void main(String[] args) throws InterruptedException {
        Counter counter = new Counter();

        Thread thread1 = new CounterThread(counter);
        Thread thread2 = new CounterThread(counter);

        thread1.start();
        thread2.start();

        thread1.join();
        thread2.join();

        System.out.println(counter.getCount());
    }
}
本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: java Lock synchronized 线程同步 锁机制
最后更新:2023年 5月 2日

墨风如雪

一个热爱生活,热爱分享的程序员

打赏 点赞
< 上一篇
下一篇 >

文章评论

您需要 登录 之后才可以评论

墨风如雪

一个热爱生活,热爱分享的程序员

最新 热点 随机
最新 热点 随机
小红书AI新里程碑:dots.llm1,中文MoE的“人文”突破! 告别机械感!OpenAudio S1让AI声音活起来 Sora触手可及!微软必应AI视频生成器,全民创作时代来临? 阿里WebAgent开源:引领自主搜索新纪元 重磅炸弹!字节跳动开源BAGEL:70亿参数,统一多模态理解与生成,AI“全能王”诞生记! 小米MiMo-VL:7B参数,怎么就成了多模态界的“越级打怪王”?
AI圈炸锅了!Mistral Medium 3:性能 SOTA,成本打骨折,企业玩家的新宠?字节终于开源“扣子”同款引擎了!FlowGram:AI 时代的可视化工作流利器告别“微信黑箱”!Chatlog:让你的聊天记录也能拥有“AI大脑”!字节跳动 Seed-Coder-8B:不靠人工洗数据,这80亿参数的小模型如何写出顶尖代码?85倍速的视觉革命:苹果发布 FastVLM,让你的 iPhone ‘看图说话’,快到飞起!告别AI视频“变脸怪”!腾讯混元Hunyuan Custom重磅开源,主体一致性“王炸”来了!
SpringMVC 核心组件 DispatcherServlet详解 字节跳动炸开AI新边界!开源多模态模型BAGEL:这颗“魔法贝果”有多能打? 重磅!小米刚刚发布了4款AI模型:7B小模型逆袭,硬刚GPT-4o! 开拍!谷歌 Veo 2 正式登陆 Gemini API - 你的视频工作流,准备好被颠覆了吗? java 微服务框架技术Apache ServiceComb 每日一道算法题:合并两个有序链表
标签聚合
算法 设计模式 deepseek 动态规划 java spring AI 教程

COPYRIGHT © 2023 墨风如雪博客. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

免责声明 - 隐私政策