并发的三个工具类

简介: 并发的三个工具类

1、CountDownLatch

计数器

package com.juc.ofok.demo;
import java.util.concurrent.CountDownLatch;
/**
 * 代码源于生活,高于生活
 *
 * @author ofok
 * @date 2020-04-19 18:45:33
 */
public class CountDownLatchDemo {
    /**
     *  有些任务是不得不阻塞的, 减法计数器
     */
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(6);
        for (int i = 0; i <= countDownLatch.getCount(); i++) {
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + " start ");
                // 出去一个人计数器就减 -1
                countDownLatch.countDown();
            }, String.valueOf(i)).start();
        }
        // 阻塞等待计数器归零
        countDownLatch.await();
        // 阻塞的操作:计数器 num++
        System.out.println(Thread.currentThread().getName() + " === END ");
    }
    /**
     *  结果诡异的嘛?达不到预期的 Main end 在最后一个
     */
    public static void test1() {
        for (int i = 1; i <= 6; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+" start ");
            }, String.valueOf(i)).start();
        }
        System.out.println(Thread.currentThread().getName() + " End ");
    }
}

CountDownLatch countDownLatch = new CountDownLatch(6);

countDownLatch.countDown(); 出去一个人计数器就 -1

countDownLatch.await(); 阻塞等待计数器归零

2、CyclicBarrier 回环栅栏 计数器加法

package com.ofok.juc.demo;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/**
 * 代码源于生活,高于生活
 * 回环栅栏 计数器加法
 *
 * @author ofok
 * @date 2020-04-19 18:45:33
 */
public class CyclicBarrierDemo {
    public static void main(String[] args) {
        // 集齐7个龙珠召唤神龙 ++ 1//
        // 等待cyclicBarrier计数器满,就执行后面的Runnable,不满就阻塞
        CyclicBarrier cyclicBarrier = new CyclicBarrier(7, new Runnable() {
            @Override
            public void run() {
                System.out.println("神龙召唤成功!");
            }
        });
        for (int i = 1; i <= 7; i++) {
            final int temp = i;
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + "收集了第" + temp + "颗龙珠");
                try {
                    cyclicBarrier.await();
                    // 等待 阻塞
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }, String.valueOf(i)).start();
        }
    }
}

3、信号量(信号灯)

package com.ofok.juc.demo;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
/**
 * 代码源于生活,高于生活
 * 信号量(信号灯) 抢车位
 *
 * @author ofok
 * @date 2020-04-19 18:45:33
 */
public class SemaphoreDemo {
    public static void main(String[] args) {
        // 模拟6个车,只有3个车位
        // 3个位置
        Semaphore semaphore = new Semaphore(3);
        for (int i = 1; i <= 6; i++) {
            new Thread(() -> {
                // 得到车位
                try {
                    semaphore.acquire(); // 得到
                    System.out.println(Thread.currentThread().getName() + "抢到了车位");
                    TimeUnit.SECONDS.sleep(3);
                    System.out.println(Thread.currentThread().getName() + "离开了车位");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    // 释放位置
                    semaphore.release();
                }
            }, String.valueOf(i)).start();
        }
    }
}
目录
相关文章
|
2月前
|
缓存
【工具篇】使用concurrentHashMap实现缓存工具类
【工具篇】使用concurrentHashMap实现缓存工具类
|
2月前
|
缓存 安全 Java
Java的线程池与并发工具类技术性文章
Java的线程池与并发工具类技术性文章
13 0
|
2月前
|
安全 Java
深入理解 Java 多线程和并发工具类
【4月更文挑战第19天】本文探讨了Java多线程和并发工具类在实现高性能应用程序中的关键作用。通过继承`Thread`或实现`Runnable`创建线程,利用`Executors`管理线程池,以及使用`Semaphore`、`CountDownLatch`和`CyclicBarrier`进行线程同步。保证线程安全、实现线程协作和性能调优(如设置线程池大小、避免不必要同步)是重要环节。理解并恰当运用这些工具能提升程序效率和可靠性。
|
12月前
|
分布式计算 测试技术 开发者
JUC基础(五)—— 并发工具类
JUC基础(五)—— 并发工具类
94 0
|
2月前
|
安全 Java 调度
【多线程】Java如何实现多线程?如何保证线程安全?如何自定义线程池?
【多线程】Java如何实现多线程?如何保证线程安全?如何自定义线程池?
218 0
|
11月前
|
设计模式 缓存 Java
【Java|多线程与高并发】线程池详解
Java线程池是一种用于管理和重用线程的机制,它可以在需要执行任务时,从线程池中获取线程,执行任务,然后将线程放回池中,以便后续使用。线程池可以有效地管理线程的数量,提高程序的性能和资源利用率。
【Java|多线程与高并发】线程池详解
|
11月前
|
安全 Java 开发者
【Java|多线程与高并发】JUC中常用的类和接口
JUC是Java并发编程中的一个重要模块,全称为Java Util Concurrent(Java并发工具包),它提供了一组用于多线程编程的工具类和框架,帮助开发者更方便地编写线程安全的并发代码。
|
数据库连接 数据库 uml
【并发编程】并发工具类
【并发编程】并发工具类
JUC 常用 4 大并发工具类
JUC就是java.util.concurrent包,这个包俗称JUC,里面都是解决并发问题的一些定义类,包括,CountDownLatch,CyclicBarrier,Semaphore,ExChanger
JUC 常用 4 大并发工具类
|
数据库连接
防止多线程同时操作一个资源,不能不学的JUC工具类: Semaphore详解
在工作中我们经常需要考虑对资源的使用,避免资源被过度使用或者资源没有被利用到而造成的问题,那我们该如何去限制访问某些资源的线程数目,从而对完成资源的保护。

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    27
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    27
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    27
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    28
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    25
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    31
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    22
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    20
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    21
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    20