首页 > 编程语言 >java-线程互斥同步

java-线程互斥同步

时间:2023-03-20 11:33:17浏览次数:39  
标签:java synchronized int lock ReentrantLock 互斥 线程


写在前边,
/**
* 线程互斥同步:通过两种锁机制来控制多个线程对共享资源的互斥访问,synchronized、ReentrantLock
*/

一、JVM实现的synchronized。使用synchronized不用担心没有释放锁导致死锁的问题,因为jvm会确认锁的释放
class SynchronizedExample{

    public synchronized void m1_1(){
        for (int i =0;i<10;i++){
            System.out.println(i+"");
        }
    }

    public synchronized void m2_1(){
        for (int i =11;i<20;i++){
            System.out.println(i+"");
        }
    }


    public synchronized static void m1_1_1(){
        // 同步一个静态方法
    }

    public void m1_2(){
        // 同步一个类,作用于整个类,如果两个线程调用同一个类的不同对象,也会进行同步
        synchronized (SynchronizedExample.class){
            for (int i=0;i<10;i++){
                System.out.println(i+"");
            }
        }
    }

    public void m2(){
        // 同步代码块
        synchronized (this){
            for (int i=0;i<10;i++){
                System.out.println(i+"");
            }
        }
    }

    public static void main(String[] args) {
        SynchronizedExample se1 = new SynchronizedExample();
        SynchronizedExample se2 = new SynchronizedExample();
        ExecutorService executorService = Executors.newCachedThreadPool();
        // 以下两行,两个线程调用了同一对象的同步代码块,因此这两个线程会进行同步。当一个线程进入同步语句块时,另一个线程必须等待
//        executorService.execute(se1::m2);
//        executorService.execute(se1::m2);

        // 以下两行,两个线程调用了同一对象的两个同步方法,这两个线程也会同步
//        executorService.execute(se1::m1_1);
//        executorService.execute(se1::m2_1);

        // 以下两行,两个线程调用了不同对象的同步代码块,因此这两个线程不需要同步,两个线程交叉执行
//        executorService.execute(se1::m2);
//        executorService.execute(se2::m2);

        // 以下两行,两个线程调用了不同对象的作用于整个类的同步代码块,因此这两个线程会进行同步。当一个线程进入同步语句块时,另一个线程必须等待
//        executorService.execute(se1::m1_2);
//        executorService.execute(se2::m1_2);

        executorService.shutdownNow();
    }

}

二、jdk实现的ReentrantLock,是J.U.C包中的锁
class ReentrantLockExample{

    private Lock lock = new ReentrantLock();

    public void m1(){
        lock.lock();
        try{
            for (int i =0;i<10;i++){
                System.out.println(i+"");
            }
        }finally {
            lock.unlock();  // 确保释放锁,避免死锁
        }
    }

    public static void main(String[] args) {
        ReentrantLockExample reentrantLockExample = new ReentrantLockExample();
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.execute(reentrantLockExample::m1);
        executorService.execute(reentrantLockExample::m1);

        executorService.shutdown();

    }

}
>>>输出结果
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9



标签:java,synchronized,int,lock,ReentrantLock,互斥,线程
From: https://www.cnblogs.com/jinziguang/p/17235743.html

相关文章

  • java-线程的使用方式
    前言,三种使用线程的方法:实现Runnable接口、实现Callable接口、继承Thread类。实现接口会更好,因为继承了Thread类就无法继承其他类,但可以实现多个接口/***线程状态:new、r......
  • Java 中如何优化大量的 if...else...
    策略模式(StrategyPattern)将每个条件分支的实现作为一个独立的策略类,然后使用一个上下文对象来选择要执行的策略。这种方法可以将大量的ifelse语句转换为对象之间的交互......
  • Java访问权限修饰符(public , private , protected)
    访问权限修饰符包括:public、protected、private和默认修饰符(friendly/包访问权限)。可以修饰在类、字段、方法前面。public:公开权限,所有类都可以访问。protected:继承访......
  • java 项目使用 本地的gradle wrapper 或者 mvn gradle
    使用ganradle的好处是当前项目对版本idea自动下载mvnwrapper目录结构.mvnwrappermaven-wrapper.jarmaven-wrapper.propertiesMaven......
  • java-基础线程机制
     前言,基础线程机制:Executor管理多个异步任务的执行、Daemon守护线程、sleep()、yield() 一、Executor:1.newCachedThreadPool(),一个任务创建一个线程ExecutorServic......
  • 线程、进程
    一个进程中有多个线程,多个线程共享进程的堆和方法区资源,但是每个线程有自己的程序计数器和栈区域。程序计数器是一块内存区域,用来记录线程当前要执行的指令地址。每个线......
  • Java基础语法-数组
    第一部分:数组1.数组1.1数组介绍数组就是存储数据长度固定的容器,存储多个数据的数据类型要一致。1.2数组的定义格式1.2.1第一种格式数据类型[]数组名示例:int[]arr......
  • 【Java】Mybatis Plus LambdaQueryWrapper梳理
    【Java】Mybatis-PlusLambdaQueryWrapper梳理前言为了更方便的实现动态SQL,MybatisPlus在其基础上扩展了LambdaQueryWrapper,LambdaQueryWrapper提供了​​更加简便的查......
  • Tars-Java网络编程源码分析
    作者:vivo互联网服务器团队-JinKai本文从JavaNIO网络编程的基础知识讲到了Tars框架使用NIO进行网络编程的源码分析。一、Tars框架基本介绍Tars是腾讯开源的支持多语言的......
  • Playwright+JavaScript-1.环境准备与快速开始
    前言Playwright可以支持在TypeScript、JavaScript、Python、.NET、Java中使用,本系列以JavaScript语言为示例。环境准备1.安装node.js需要Node.js14或更高版本2......