当前位置: 首页 > web >正文

JUC的安全并发包机制

目录

1. Lock机制:明锁控制

2. 栅栏机制(CyclicBarrier)

3. 闭锁机制(CountDownLatch)

4. 信号量机制(Semaphore)

5. 无锁机制


1. Lock机制:明锁控制

        Lock接口提供了比synchronized更灵活的锁机制,属于明锁(需要手动获取和释放锁)。与synchronized隐式锁不同,Lock需要显式地调用lock()和unlock()方法。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class LockDemo {private Lock lock = new ReentrantLock();private int count = 0;public void increment() {lock.lock();  // 手动获取锁try {count++;} finally {lock.unlock();  // 必须在finally中手动释放锁}}
}

2. 栅栏机制(CyclicBarrier)

        栅栏机制允许一组线程相互等待,直到所有线程都到达某个屏障点,然后所有线程才会继续执行。CyclicBarrier可以重复使用,适用于分阶段的任务处理。

package com.demo5;import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;/*** * 研学,旅游公司包车,一个车做4个同学,坐满就发车; 总共有28个人,怎么控制和实现?**/public class Test {public static void main(String[] args) {// 设置屏障点CyclicBarrier cb = new CyclicBarrier(4, () -> {System.out.println("已经有4个同学了,就发车吧, 旅游车已经启动出发");});for (int i = 0; i < 28; i++) {Runnable r = () -> {System.out.println("学生来报道............");try {cb.await();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (BrokenBarrierException e) {// TODO Auto-generated catch blocke.printStackTrace();}};try {Thread.sleep(3000);} catch (InterruptedException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}new Thread(r).start();}}}

运行结果:

3. 闭锁机制(CountDownLatch)

        闭锁是一种一次性使用的同步辅助工具,允许一个或多个线程等待其他线程完成操作。

package com.demo8;import java.util.concurrent.CountDownLatch;public class Test {public static void main(String[] args) {//闭锁,任务只能执行一次CountDownLatch cdl   = new CountDownLatch(10);//10个人到了,一桌人开始吃饭,吃完就结束。for(int i=0;i<10;i++){Runnable  r = ()->{System.out.println(Thread.currentThread().getName()+",来吃饭.....");cdl.countDown();//-1,一直到0};try {Thread.sleep(2000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}new Thread(r).start();}try {cdl.await(); // 等待计数器归零,屏障点解除} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("我们开始欢乐的用餐");}}

运行结果:

4. 信号量机制(Semaphore)

        信号量用于控制同时访问特定资源的线程数量,通过许可证机制实现资源池的访问控制。

package com.demo9;import java.util.Random;
import java.util.concurrent.Semaphore;public class Test {public static void main(String[] args) {Semaphore  s  = new Semaphore(3);   // 允许3个线程同时访问for(int i=0;i<6;i++){Runnable  r = ()->{try {s.acquire();  // 获取许可System.out.println(Thread.currentThread().getName()+", 抢优惠劵");Thread.sleep(new Random().nextInt(20)*1000);System.out.println(Thread.currentThread().getName()+", 离开现场");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{s.release();  // 释放许可}};new Thread(r).start();}}}

运行结果:

5. 无锁机制

        无锁编程通过CAS(Compare And Swap)操作实现线程安全,避免了锁的开销。Java中的Atomic类就是无锁机制的典型实现。

package com.demo3;import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;public class Test {// 原子锁,就是无锁private  static  AtomicInteger  count  = new AtomicInteger(0);public static void inc() {try {Thread.sleep(1);// 毫秒count.getAndIncrement();//count加1// TimeUnit.MILLISECONDS.sleep(1);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static void main(String[] args) {CountDownLatch cd = new CountDownLatch(100);for (int i = 0; i < 100; i++) {Runnable r = () -> {Test.inc();cd.countDown();};new Thread(r).start();}try {cd.await();System.out.println("总和为:" + Test.count);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

运行结果:

http://www.xdnf.cn/news/20221.html

相关文章:

  • Python 值传递 (Pass by Value) 和引用传递 (Pass by Reference)
  • go面试题-什么是用户态和内核态
  • 数组本身的深入解析
  • 研发文档撰写质量参差不齐该怎么办
  • 突破大语言模型推理瓶颈:深度解析依赖关系与优化策略
  • YOLOv8主干网络替换为UniConvNet的详细指南
  • Unity中,软遮罩SoftMaskForUGUI的使用
  • 25高教社杯数模国赛【E题保姆级思路+问题分析】
  • 【Day 20】148.排序链表
  • Electron 执行python脚本
  • IPV6、广播地址
  • 单片机实现分页显示环形更新的历史数据
  • 算法随笔(一)
  • S32K328上芯片内部RTC的使用和唤醒配置
  • 深度学习篇---MNIST:手写数字数据集
  • 基础排序--冒泡--选择--插入
  • 【算法--链表】25.K个一组翻转链表--通俗讲解
  • Linux初始化配置——RHEL7.9、9.3环境部署
  • 【C语言】 第三课 函数与栈帧机制详解
  • RTP打包与解包全解析:从RFC规范到跨平台轻量级RTSP服务和低延迟RTSP播放器实现
  • Deeplizard深度学习课程(七)—— 神经网络实验
  • 飞算JavaAI全面解析:重塑Java开发流程的智能引擎
  • 商城源码后端性能优化:JVM 参数调优与内存泄漏排查实战
  • List<?>和List<Object>区别
  • 第二阶段WinForm-12:UI控件库
  • 力扣516 代码随想录Day16 第一题
  • 【涂鸦T5】6. lvgl显示光感数值
  • 鸿蒙:AppStorageV2状态管理和数据共享
  • Gmail 数据泄露安全警报以及启示
  • 【Linux】线程概念与控制