Java线程同步的方法和例子

在Java中,线程同步是一种机制,用于确保多个线程可以安全地访问共享资源,而不会发生数据不一致或数据损坏的情况。线程同步的主要方法包括:

synchronized关键字:这是Java中最常用的线程同步方法。它用于方法或代码块,确保同一时间只有一个线程可以访问同步方法或同步块。
示例:

java
public class SynchronizedExample {  
    private Object lock = new Object();  
      
    public void synchronizedMethod() {  
        synchronized(lock) {  
            // 同步代码块  
        }  
    }  
}
ReentrantLock:这是Java 5之后引入的一个新的线程同步工具,它提供了更灵活的锁控制。ReentrantLock可以尝试获取锁,也可以中断获取锁的操作,并且可以响应中断。
示例:

java
import java.util.concurrent.locks.ReentrantLock;  
  
public class ReentrantLockExample {  
    private final ReentrantLock lock = new ReentrantLock();  
      
    public void method() {  
        lock.lock();  // 获取锁  
        try {  
            // 同步代码块  
        } finally {  
            lock.unlock();  // 释放锁  
        }  
    }  
}
volatile关键字:volatile关键字用于声明一个变量为“易变的”,确保所有线程都从主内存中读取变量的最新值。它主要用于防止可见性问题,但并不能解决原子性问题。


Atomic类:Java的java.util.concurrent.atomic包提供了一些原子类,如AtomicInteger、AtomicLong等。这些类提供了原子操作,可以在多线程环境中安全地增加、减少或比较值。
读写锁:ReadWriteLock是一个接口,它提供了对共享资源的读取和写入访问的控制。一个线程可以同时获得读锁和写锁,但写锁是独占的,即一个线程获得写锁后,其他线程无法获得读锁或写锁。
信号量:Semaphore是一个计数信号量,用于控制对共享资源的访问。它允许一个指定数量的线程同时访问一个资源。当达到最大线程数时,其他线程必须等待直到有线程释放资源。
倒计时门闩:CountDownLatch是一个同步辅助类,允许一个或多个线程等待其他线程完成一系列操作。它允许一个或多个线程等待其他一组线程完成。
CyclicBarrier:CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到所有线程都达到某个状态后再一起继续执行。常用于并行计算中,当所有线程都完成某个任务后一起继续执行下一个任务。
Phaser:Phaser是Java 7引入的一个新的同步工具,它是一个高级同步器,用于协调通过一组阶段进行的多阶段并行任务。它可以替代使用CyclicBarrier和CountDownLatch的某些情况。

以下是一个使用Phaser进行线程同步的Java示例:

java
import java.util.concurrent.Phaser;  
import java.util.concurrent.TimeUnit;  
  
public class PhaserExample {  
    public static void main(String[] args) throws InterruptedException {  
        // 创建一个Phaser对象,初始阶段数为3  
        Phaser phaser = new Phaser(3);  
  
        // 创建三个线程,每个线程在完成一定数量的任务后向Phaser报告完成  
        Thread thread1 = new Thread(() -> {  
            for (int i = 0; i < 100; i++) {  
                System.out.println("Thread 1: " + i);  
                try {  
                    TimeUnit.MILLISECONDS.sleep(100);  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
                phaser.arriveAndAwaitAdvance(); // 任务完成,向Phaser报告完成,并等待下一次同步  
            }  
        });  
  
        Thread thread2 = new Thread(() -> {  
            for (int i = 0; i < 100; i++) {  
                System.out.println("Thread 2: " + i);  
                try {  
                    TimeUnit.MILLISECONDS.sleep(100);  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
                phaser.arriveAndAwaitAdvance(); // 任务完成,向Phaser报告完成,并等待下一次同步  
            }  
        });  
  
        Thread thread3 = new Thread(() -> {  
            for (int i = 0; i < 100; i++) {  
                System.out.println("Thread 3: " + i);  
                try {  
                    TimeUnit.MILLISECONDS.sleep(100);  
                } catch (InterruptedException e) {  
                    e.printStackTrace();  
                }  
                phaser.arriveAndAwaitAdvance(); // 任务完成,向Phaser报告完成,并等待下一次同步  
            }  
        });  
  
        // 启动线程  
        thread1.start();  
        thread2.start();  
        thread3.start();  
    }  
}
在这个例子中,我们创建了一个初始阶段数为3的Phaser对象。然后创建了三个线程,每个线程在完成一定数量的任务后向Phaser报告完成。通过调用arriveAndAwaitAdvance()方法,线程向Phaser报告完成,并等待下一次同步。当所有线程都向Phaser报告完成后,它们将一起继续执行。

这只是线程同步的一些方法和例子,根据具体的需求和场景选择适合的方法非常重要。在编写多线程程序时,务必小心处理共享数据和资源,以避免出现数据不一致或死锁等问题。

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

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

相关文章

Orange3数据预处理(分组组件)

Group By是Orange3中一个非常有用的组件&#xff0c;它允许用户对数据集进行聚合操作&#xff0c;类似于SQL中的GROUP BY语句或Pandas库中的groupby方法。以下是Group By组件的一些核心功能介绍&#xff1a; 1. Mean (平均数): 数据值的总和除以数据项的数量&#xff0c;显示数…

Megatron-LM源码系列(七):Distributed-Optimizer分布式优化器实现Part2

1. 使用入口 DistributedOptimizer类定义在megatron/optimizer/distrib_optimizer.py文件中。创建的入口是在megatron/optimizer/__init__.py文件中的get_megatron_optimizer函数中。根据传入的args.use_distributed_optimizer参数来判断是用DistributedOptimizer还是Float16O…

【持续学习系列(九)】《Continual Learning with Pre-Trained Models: A Survey》

一、论文信息 1 标题 Continual Learning with Pre-Trained Models: A Survey 2 作者 Da-Wei Zhou, Hai-Long Sun, Jingyi Ning, Han-Jia Ye, De-Chuan Zhan 3 研究机构 National Key Laboratory for Novel Software Technology, Nanjing University; School of Artifici…

C#,雅各布斯塔尔—卢卡斯(Jacobsthal Lucas Number)的算法与源代码

1 雅各布斯塔尔序列 雅各布斯塔尔序列是一个与斐波那契序列类似的加法序列&#xff0c;由递归关系JnJn-12Jn-2定义&#xff0c;初始项J00&#xff0c;J11。序列中的一个数字称为雅可布沙尔数。它们是卢卡斯序列Un&#xff08;P&#xff0c;Q&#xff09;的一种特殊类型&#x…

股票交易

这里尝试利用单调队列优化&#xff0c;这里不好直接用单调队列的原因是因为(以买为例)\(-ap[i]*k_1\)不是只与下标有关的 所以解决方案一&#xff1a;我们将下标变成一个整体&#xff0c;再把后面的代价换掉然后将与下标无关的直接提出去 解决方案二&#xff1a;利用“蚯蚓”那…

<设计模式>单例模式懒汉和饿汉

目录 一、单例模式概述 二、懒汉模式和饿汉模式 1.饿汉模式 1.1代码实现 1.2实现细节 1.3模式优劣 2.懒汉模式 2.1代码实现 2.2实现细节 2.3模式优劣 三、多线程下的线程安全问题 1.懒汉和饿汉线程安全问题分析 1.1安全的饿汉模式 1.2不安全的懒汉模式 2.懒汉线程…

YOLOv5算法进阶改进(15)— 引入密集连接卷积网络DenseNet

前言:Hello大家好,我是小哥谈。DenseNet(密集连接卷积网络)是一种深度学习神经网络架构,它在2017年由Gao Huang等人提出。DenseNet的核心思想是通过密集连接(dense connection)来促进信息的流动和共享。在传统的卷积神经网络中,每个层的输入只来自于前一层的输出。而在…

Linux下编译EtherCAT主站SOEM-1.4.1

目录 1、SOEM下载 2、CMake安装​​​​​​ 3、编译 环境&#xff1a;Ubuntu1604. 1、SOEM下载 最新版为SOEM-v1.4.0&#xff0c;可以从github下载地址&#xff1a; https://github.com/OpenEtherCATsociety/SOEM 2、CMake安装​​​​​​ 3、编译 解压文件&#xff0c…

BeanUtils.copyProperties()用法总结

BeanUtils.copyProperties()用法总结 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;今天我们来谈一谈在Java开发中常用的Bean属性拷贝工具——BeanUtils.copyProperties()&#xff0c;并总结其用法和注意事项。 1. 什么是BeanUt…

WebSocket学习笔记以及用户与客服聊天案例简单实现(springboot+vue)

一&#xff1a;介绍&#xff1a; 二&#xff1a;http协议与websocket对比&#xff1a; 三&#xff1a;websocket协议&#xff1a; 四&#xff1a;实现&#xff1a; 4.1客户端&#xff1a; 4.2服务端&#xff1a; 五&#xff1a;案例&#xff1a; 环境&#xff1a;做一个书店…

分布式任务调度框架XXL-JOB详解

分布式任务调度 概述 场景: 如12306网站根据不同车次设置放票时间点&#xff0c;商品成功发货后向客户发送短信提醒等任务,某财务系统需要在每天上午10天前统计前一天的账单数据 任务的调度是指系统为了完成特定业务&#xff0c;基于给定的时间点&#xff0c;时间间隔&#…

bat脚本 分片抓包并上传到ftp

在批处理脚本中实现分片抓包并上传到FTP服务器是一项比较复杂的任务&#xff0c;因为批处理脚本本身并不直接支持文件分片或FTP上传。但是&#xff0c;你可以结合使用一些外部工具和命令来实现这一功能。 首先&#xff0c;你需要一个用于分片的工具。WinPcap提供了一些工具和库…

【前端】弹框组件

vue2项目&#xff0c;封装的第一版弹框组件使用基于elment-ui 在vue同级创建components/dialog文件夹 里面放paramDialog.vue 父组件引入 dialogVisible要是改变量名&#xff0c;这个也记得改 <ParamDialog :title"title" :dialogVisible.sync"dialogVisibl…

onnx转换为rknn置信度大于1,图像出现乱框问题解决

前言 环境介绍&#xff1a; 1.编译环境 Ubuntu 18.04.5 LTS 2.RKNN版本 py3.8-rknn2-1.4.0 3.单板 迅为itop-3568开发板 一、现象 采用yolov5训练并将pt转换为onnx&#xff0c;再将onnx采用py3.8-rknn2-1.4.0推理转换为rknn出现置信度大于1&#xff0c;并且图像乱框问题…

C#下“Bitmap”转换为“BitmapImage”,“Bitmap”转换成“BitmapSource”

在实际开发中时常遇到“Bitmap”转换为“BitmapImage”&#xff0c;“Bitmap”转换成“BitmapSource”格式转化的开发&#xff0c;特此记录。 1、“Bitmap”转换为“BitmapImage” 要将 System.Drawing.Bitmap 转换为 System.Windows.Media.Imaging.BitmapImage&#xff0c;我…

【服务器】RAID(独立磁盘冗余阵列)

RAID&#xff08;独立磁盘冗余阵列&#xff09; 一、RAID的介绍二、RAID的分类#2-1 RAID 02-2 RAID 1#2-3 RAID 32-4 RAID 52-5 RAID 62-6 RAID 10(先做镜像&#xff0c;再做条带化)2-7 RAID 01&#xff08;先做条带&#xff0c;再做镜像&#xff09;2-8 RAID比较 三、磁盘阵列…

代码随想录刷题第24天

今天正式进入回溯。看了看文章介绍&#xff0c;回溯并不是很高效的算法&#xff0c;本质上是穷举操作。代码形式较为固定。 第一题为组合问题&#xff0c;用树形结构模拟&#xff0c;利用回溯算法三部曲&#xff0c;确定终止条件与单层逻辑&#xff0c;写出如下代码。 不难发现…

负载均衡下webshell连接

目录 一、什么是负载均衡 分类 负载均衡算法 分类介绍 分类 均衡技术 主要应用 安装docker-compose 2.1上传的文件丢失 2.2 命令执行时的漂移 2.3 大工具投放失败 2.4 内网穿透工具失效 3.一些解决方案 总结 一、什么是负载均衡 负载均衡&#xff08;Load Balanc…

网络安全挑战:威胁建模的应对策略与实践

在数字威胁不断演变的时代&#xff0c;了解和降低网络安全风险对各种规模的组织都至关重要。威胁建模作为安全领域的一个关键流程&#xff0c;提供了一种识别、评估和应对潜在安全威胁的结构化方法。本文将深入探讨威胁建模的复杂性&#xff0c;探索其机制、方法、实际应用、优…

python爬虫5

1.selenium交互 无页面浏览器速度更快 #配置好的自己不用管 from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionschrome_options Options()chrome_options.add_argument(‐‐headless)chrome_options.add_argument(‐‐disable‐gpu)# path…