有哪些更复杂的并发编程概念可以进一步学习?

  1. 并发集合:Java 提供了一套并发集合类,如 ConcurrentHashMapConcurrentLinkedQueue 和 CopyOnWriteArrayList 等,可以在并发环境下使用,而不需担心线程安全问题。

  2. 原子变量java.util.concurrent.atomic 包提供了一组原子变量类,如 AtomicIntegerAtomicLongAtomicReference 等,可以在并发环境下进行线程安全的操作。

  3. 信号量(Semaphore):如果你需要限制某些资源的并发访问数量,你可能需要研究一下信号量。这是一个可以控制同时访问特定资源的线程数的计数器。

  4. CountDownLatch 和 CyclicBarrier:这两个类可以帮助你协调多线程之间的操作,例如,可以使一个线程等待其它线程完成各自的工作后再执行。

  5. Callable 和 FutureTask:除了Runnable接口,Java还提供了Callable接口,它允许有返回值的任务。FutureTask 可以将 Callable 任务转换为 Future 对象,从而获取任务的运行结果。

  6. 线程安全的数据类型:例如 ReentrantLockReentrantReadWriteLock 和 StampedLock。这些工具可以帮助你在处理复杂的并发情况时,保证数据的一致性。

  7. Fork/Join 框架:这个框架可以帮助你并行的执行任务,利用多核处理器的优势,提高 java 程序的性能。

以下为Java示例:

       并发集合(ConcurrentHashMap):

import java.util.concurrent.*;public class Main {public static void main(String[] args) {ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();map.put("One", 1);map.put("Two", 2);map.put("Three", 3);map.forEach((k, v) -> System.out.println(k + " = " + v));}
}

原子变量(AtomicInteger):

import java.util.concurrent.atomic.*;public class Main {public static void main(String[] args) {AtomicInteger atomicInt = new AtomicInteger(0);atomicInt.incrementAndGet();System.out.println(atomicInt); //Prints 1}
}

信号量(Semaphore):

import java.util.concurrent.*;public class Main {public static void main(String[] args) {Semaphore semaphore = new Semaphore(1); // Only one thread can acquire at a timetry {semaphore.acquire();// critical section here} catch (InterruptedException e) {e.printStackTrace();} finally {semaphore.release(); // release the permit}}
}

CountDownLatch:

import java.util.concurrent.*;public class Main {public static void main(String[] args) throws InterruptedException {CountDownLatch latch = new CountDownLatch(3); // three threads to wait fornew Thread(() -> { System.out.println("Thread 1 finished"); latch.countDown(); }).start();new Thread(() -> { System.out.println("Thread 2 finished"); latch.countDown(); }).start();new Thread(() -> { System.out.println("Thread 3 finished"); latch.countDown(); }).start();latch.await(); // wait for all three threads to finishSystem.out.println("All threads finished"); // print after all threads have finished}
}

Callable 和 FutureTask:

import java.util.concurrent.*;public class Main {public static void main(String[] args) throws ExecutionException, InterruptedException {Callable<Integer> task = () -> {TimeUnit.SECONDS.sleep(1);return 123;};FutureTask<Integer> futureTask = new FutureTask<>(task);new Thread(futureTask).start();System.out.println("futureTask.get() = " + futureTask.get()); // Will output: futureTask.get() = 123}
}

线程安全的数据类型(ReentrantLock):

import java.util.concurrent.locks.*;public class Counter {private final ReentrantLock lock = new ReentrantLock();private int count = 0;public void increment() {lock.lock();try {count++;} finally {lock.unlock();}}public void decrement() {lock.lock();try {count--;} finally {lock.unlock();}}public int value() {lock.lock();try {return count;} finally {lock.unlock();}}
}

Fork/Join 框架:

import java.util.concurrent.*;class SimpleRecursiveTask extends RecursiveTask<Integer> {private int simulatedWork;public SimpleRecursiveTask(int simulatedWork) {this.simulatedWork = simulatedWork;}@Overrideprotected Integer compute() {if(simulatedWork > 100) {System.out.println("Parallel execution and split task : " + simulatedWork);SimpleRecursiveTask simpleRecursiveTask1 = new SimpleRecursiveTask(simulatedWork/2);SimpleRecursiveTask simpleRecursiveTask2 = new SimpleRecursiveTask(simulatedWork/2);simpleRecursiveTask1.fork();simpleRecursiveTask2.fork();int solution = 0;solution = solution + simpleRecursiveTask1.join();solution = solution + simpleRecursiveTask2.join();return solution;} else {System.out.println("No need for parallel execution, sequential algorithm is ok. " + simulatedWork);return 2 * simulatedWork;}}
}public class Main {public static void main(String[] args) {ForkJoinPool forkJoinPool = new ForkJoinPool(Runtime.getRuntime().availableProcessors());SimpleRecursiveTask simpleRecursiveAction = new SimpleRecursiveTask(120);System.out.println(forkJoinPool.invoke(simpleRecursiveAction));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/814557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动化运维(二十八)Ansible 实战之最佳安全实践

Ansible是直接操作我们服务器的工具&#xff0c;Ansible是否安全关系到整个生产和办公环境的数据安全&#xff0c;因此确保 Ansible 安全地运行非常重要。以下是有关 Ansible 安全的详细介绍&#xff0c;包括如何安全地使用 Ansible 和一些最佳安全实践。 1. Ansible 安全概念…

[大模型] BlueLM-7B-Chat WebDemo 部署

BlueLM-7B-Chat WebDemo 部署 模型介绍 BlueLM-7B 是由 vivo AI 全球研究院自主研发的大规模预训练语言模型&#xff0c;参数规模为 70 亿。BlueLM-7B 在 C-Eval 和 CMMLU 上均取得领先结果&#xff0c;对比同尺寸开源模型中具有较强的竞争力(截止11月1号)。本次发布共包含 7…

我与C++的爱恋:类与对象(二)

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 ​ 本篇着重介绍构造函数和析构函数&#xff0c;剩余内容在下篇解答。 一、类的默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 任何类在什么都不写时…

ThingsBoard通过服务端获取客户端属性或者共享属性

MQTT基础 客户端 MQTT连接 通过服务端获取属性值 案例 1、首先需要创建整个设备的信息&#xff0c;并复制访问令牌 ​2、通过工具MQTTX连接上对应的Topic 3、测试链接是否成功 4、通过服务端获取属性值 5、在客户端查看对应的客户端属性或者共享属性的key 6、查看整个…

java的gradle,maven工程中使用selenium

一、下载selenium库 &#xff08;1&#xff09;gradle工程 工程中会有一个build.gradle.kts的文件&#xff0c;这个文件可以定制 Gradle 的行为 在文件中添加下面代码&#xff0c;然后sync // implementation ("org.seleniumhq.selenium:selenium-java:4.19.1") …

基于spring boot的留守儿童爱心管理系统

基于spring boot的留守儿童爱心管理系统设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开…

《剑指 Offer》专项突破版 - 面试题 108 : 单词演变(C++ 实现)

目录 前言 单向广度优先搜索 双向广度优先搜索 前言 题目链接&#xff1a;单词演变 题目&#xff1a; 输入两个长度相同但内容不同的单词&#xff08;beginWord 和 endWord&#xff09;和一个单词列表&#xff08;wordList&#xff09;&#xff0c;求从 beginWord 到 end…

HTML5+CSS3小实例:荧光图标悬停效果

实例:荧光图标悬停效果 技术栈:HTML+CSS 字体图标库:font-awesome 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=d…

Django的APP应用更名(重命名)流程

将Django中的一个现有APP更名是一个需要谨慎操作的过程&#xff0c;因为它涉及到多个文件和配置的更新。下面是详细的步骤和一些补充细节&#xff0c;帮助你更顺利地完成APP重命名&#xff1a; 1. 修改APP名称及相关引用 更改APP目录名称&#xff1a; 首先&#xff0c;重命名…

vue3<script setup>中点击li为当前li添加一个类名active

在 Vue 3 的 <script setup> 语法中&#xff0c;可以使用 ref 或 reactive 来追踪和管理 DOM 元素的引用。然后&#xff0c;你可以使用事件监听器&#xff08;如 click&#xff09;来响应点击事件&#xff0c;并为当前点击的 <li> 元素添加 active 类名。 <tem…

T620折腾 —— 给虚拟机配置大页

虚拟机访问物理内存需要经过两级页表翻译,如果使用大页,一方面可以降低缺页发生的频率,同时也可以降低TLB Miss的频率,对于提升虚拟机的运行性能有一定作用,下面尝试开启这一功能: 给大页预留内存 使用下面的命令查看Host预留了多少大页: $ sysctl vm.nr_hugepages如…

VulNyx - Ready

目录 信息收集 arp nmap nikto Redis未授权访问漏洞 漏洞扫描 redis-cli 写入公钥 ssh连接 get root.txt 信息收集 arp ┌─[rootparrot]─[~/vulnyx] └──╼ #arp-scan -l Interface: enp0s3, type: EN10MB, MAC: 08:00:27:16:3d:f8, IPv4: 192.168.9.102 Starti…

JAVA学习-注解.基本语法

Java注解是一种用于为程序元素&#xff08;如类、方法、字段、参数等&#xff09;添加元数据的标记。它们提供了一种简单而又强大的方式来在源代码中插入元数据&#xff0c;以及编译器、工具和框架等在处理程序时使用这些元数据。 一、Java注解的基本语法如下&#xff1a; 1.…

ZFT9 7VE8033同期脉冲发送装置 JSOEF约瑟

系列型号 ZFT9(PIG) 7VE8033同期脉冲发送装置; ZFT9(PIG) 7VE8043同期脉冲发送装置; ZFT9 7VE8033同期脉冲发送装置; ZFT9 7VE8043同期脉冲发送装置; 用途&#xff1a; ZFT9(PIG)同期脉冲发送装置用于船舶的三相系统&#xff0c;根据发电机和电力系统之间电压差、相位差、频率…

SAP SD学习笔记05 - SD中的一括处理(集中处理),出荷和请求的冻结(替代实现承认功能)

上一章讲了SD的重要概念&#xff0c;比如出荷Plant&#xff08;交货工厂&#xff09;&#xff0c;出荷Point&#xff08;装运点&#xff09;&#xff0c;输送计划&#xff0c;品目的可用性检查&#xff0c;一括纳入/分割纳入&#xff0c;仓库管理等。 SAP SD学习笔记04 - 出荷…

凡泰极客亮相2024 亚马逊云科技出海全球化论坛,为企业数字化出海赋能

随着「不出海&#xff0c;即出局」登上热搜榜单&#xff0c;企业出海已成燎原之势&#xff0c;3月29日&#xff0c;2024 亚马逊云科技出海全球化论坛在深圳成功举办&#xff0c;凡泰极客创始人梁启鸿受邀出席&#xff0c;并以 「App 2.0&#xff1a;以SuperApp构建智能数字生态…

K8s下部署grafana

1. 系统要求 最小化的软硬件要求 最小化硬件要求 磁盘空间: 1 GB内存: 750 MiB (approx 750 MB)CPU: 250m (approx 2.5 cores) 2. k8s部署grafana步骤 1) 创建名字空间 kubectl create namespace my-grafana 2) 创建yaml vim grafana.yaml yaml包含如下三个资源对象 Ob…

【七 (4)FineBI FCP模拟试卷-电站数据分析】

目录 文章导航一、字段解释1、电站基础信息表2、电站事实表 二、需求三、操作步骤1、将新增一列日期12、以左关联的形式增加装机容量3、年度发电总量4、年度售电完成率4、发电量及发电效率5、年售电完成比、售电回款比、管理费用比、运维费用比5、总装机容量6、最近日期7、最近…

Java基础-知识点03(面试|学习)

Java基础-知识点03 String类String类的作用及特性String不可以改变的原因及好处String、StringBuilder、StringBuffer的区别String中的replace和replaceAll的区别字符串拼接使用还是使用StringbuilderString中的equal()与Object方法中equals()区别String a new String("a…

使用 Docker 部署 Open-Resume 在线简历平台

1&#xff09;Open-Resume 介绍 GitHub&#xff1a; https://github.com/xitanggg/open-resume Open-Resume 是一款功能强大的开源 简历生成器 和 简历解析器 。可以帮助我们快速的生成个人简历&#xff0c;并定制化不同的主题和布局风格。该项目的目标是为每个人提供免费的现…