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

78-java 多线程如何共享数据

在Java中,多个线程可以通过共享对象来共享数据。这可以通过以下几种方式实现:

  1. 实例变量共享:如果多个线程访问同一个对象的实例变量,那么这些线程将共享这些实例变量。

    public class SharedData {public int sharedData = 0;public void increase() {sharedData++;}
    }public class ThreadExample implements Runnable {private SharedData sharedData;public ThreadExample(SharedData sharedData) {this.sharedData = sharedData;}@Overridepublic void run() {for (int i = 0; i < 10; i++) {sharedData.increase();}}
    }public class Main {public static void main(String[] args) {SharedData sharedData = new SharedData();ThreadExample example = new ThreadExample(sharedData);Thread t1 = new Thread(example);Thread t2 = new Thread(example);t1.start();t2.start();try {t1.join();t2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("SharedData: " + sharedData.sharedData);}
    }
  2. 使用volatile关键字:如果你希望确保所有线程看到共享变量的最新值,并且不会缓存这个变量的旧值,你可以使用volatile关键字。

    public class SharedData {public volatile int sharedData = 0;public void increase() {sharedData++;}
    }
  3. 使用synchronized关键字:当你需要在多个线程之间同步访问共享数据时,可以使用synchronized关键字。

    public class SharedData {public int sharedData = 0;public synchronized void increase() {sharedData++;}
    }
  4. 使用ReentrantLockReentrantLock提供了比synchronized更广泛的锁定操作,可以更灵活地控制同步。

    import java.util.concurrent.locks.ReentrantLock;public class SharedData {public int sharedData = 0;private final ReentrantLock lock = new ReentrantLock();public void increase() {lock.lock();try {sharedData++;} finally {lock.unlock();}}
    }
  5. 使用原子变量:java.util.concurrent.atomic包中的原子变量类提供了一种方式来进行无锁的、线程安全的操作。

    import java.util.concurrent.atomic.AtomicInteger;public class SharedData {public AtomicInteger sharedData = new AtomicInteger(0);public void increase() {sharedData.incrementAndGet();}
    }
  6. 使用线程安全集合:java.util.concurrent包中提供了一些线程安全的集合类,可以用来存储共享数据。

    import java.util.concurrent.ConcurrentHashMap;public class SharedData {public ConcurrentHashMap<String, Integer> sharedData = new ConcurrentHashMap<>();public void increase(String key) {sharedData.compute(key, (k, v) -> v == null ? 1 : v + 1);}
    }
  7. 使用ThreadLocalThreadLocal可以为每个线程提供一个独立的变量副本,从而避免共享数据。

    public class ThreadLocalExample {public static final ThreadLocal<Integer> localData =

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 一篇文章了解Pytest单元测试框架
  • Vue3前端框架学习记录
  • Leetcode sql high frequency questions 50 (based)
  • Go日志系统
  • 【Go】-Gin框架
  • 什么是Aware注入?
  • Python之异常处理与程序调试(Exception Handling and Program Debugging in Python)
  • 银河麒麟v10-sp3 -x86系统创建新分区扩展lvm
  • java基础-IO(6)转换流InputStreamReader、OutputStreamWriter
  • 内存分区学习
  • Qt使用绿色pdf阅读器打开文件
  • java spring定时任务-动态任务
  • 认知杂谈59《实力为王:用硬本事赢得尊重,开启人生逆袭路》
  • Python3中函数的用法
  • linux-用户与权限管理-组管理
  • 【附node操作实例】redis简明入门系列—字符串类型
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • Docker下部署自己的LNMP工作环境
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Fundebug计费标准解释:事件数是如何定义的?
  • JavaWeb(学习笔记二)
  • java正则表式的使用
  • Less 日常用法
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • PAT A1050
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • scala基础语法(二)
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 彻底搞懂浏览器Event-loop
  • 大快搜索数据爬虫技术实例安装教学篇
  • 复习Javascript专题(四):js中的深浅拷贝
  • 给第三方使用接口的 URL 签名实现
  • 紧急通知:《观止-微软》请在经管柜购买!
  • -- 数据结构 顺序表 --Java
  • 微信小程序:实现悬浮返回和分享按钮
  • ionic异常记录
  • mysql面试题分组并合并列
  • NLPIR智能语义技术让大数据挖掘更简单
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #QT项目实战(天气预报)
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • $forceUpdate()函数
  • (6)STL算法之转换
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (利用IDEA+Maven)定制属于自己的jar包
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (一)Docker基本介绍
  • (译) 函数式 JS #1:简介
  • .NET Framework杂记
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明