线程与线程安全

多线程——线程安全与线程同步 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。 阅读详情

--什么是进程什么线程:

  • 进程:操作系统分配资源和调度的基本单位
  • 线程:进程中的一个执行单元,CPU调度的基本单元

所以一个进程可以包含多个线程,这些线程共享进程的内存空间和资源

--进程与线程的区别:

  1. 资源分配上:进程与进程之间相互独立,每个进程拥有自己独立的内存空间和系统资源
    线程共享自己对应进程的资源
  2. 切换开销上:线程的切换开销小于进程(线程共享进程资源,所有线程间切换不用更换内存地址空间)
  3. 通信方式上:进程之间的通信 需要通过 进程间通信机制,如管道、消息队列、共享内存等
    而 线程之间通信 直接通过共享内存就可以

CPU 核心处理器:

  • 单核心单线程CPU: 执行运行单线程程序 ,如果需要执行多个线程 只能在CPU上交替执行 不会有性能的提升

  • 多核心多线程CPU: CPU的线程数量越多 ,执行多线程程序的效率就越高 上限越高 ,但是最大效率受到CPU线程数的限制

--什么是程序(分为两种状态)

  • 非运行:代码文件 + 资源文件

  • 运行:程序被操作系统加载到内存中运行时,称为进程,此时程序处于动态执行状态

    • 通过(代码-计算机硬件设备指令集)调用计算机资源(CPU+RAM+IO)解决问题

--Java实现线程的方式

  1. 继承Tread类
    (run方法也是被重写了,但是不重写run方法不报错)
     
    class ThreadDemo extends Thread {
        String ID;
        public ThreadDemo(String ID) {
            this.ID = ID;
        }
    
        public void run() {
            for (int i = 0; i < 100; i++) {
                System.out.println("线程编号"+ID+"->执行打印"+i);
            }
        }
    }

  2. 实现Runnable接口(需要重写run方法,不重写报错)
     
    class runRunnable implements Runnable {
        String ID;
        public runRunnable(String ID) {
            this.ID = ID;
        }
        @Override
        public void run() {
            for (int i = 0; i < 100; i++) {
                System.out.println("线程编号"+ID+"->执行打印"+i);
            }
        }
    }
    

    两种方式有什么区别?

public class ThreadTest {
    public static void main(String[] args) {
//        ThreadTestDemo td = new ThreadTestDemo("1");
//        ThreadTestDemo td2 = new ThreadTestDemo("2");
//
//        td.start();
//        td2.start();

        runRunnable run1 = new runRunnable("r1");
        runRunnable run2 = new runRunnable("r2");

        Thread r1 = new Thread(run1);
        Thread r2 = new Thread(run2);
        r1.start();
        r2.start();

    }
}
  • 1.通过接口实现线程 会更加的灵活(有继承别的类的机会) 其本质是 线程任务执行类(这也是为什么 接口实现的线程 要通过Thread类才可以启动)
  • 2.Thread类本质 是 线程管理类 (这也是为什么 接口实现的线程 要通过Thread类才可以启动)

--线程安全问题:

        什么是线程安全问题?

                线程安全问题指的是:不同线程 同时 访问修改 相同的数据 造成数据更新不及时 

class MyThread implements Runnable{
    static int counter = 0;
    @Override
    public void run() {
        for (int i = 0; i < 10000; i++) {
            counter++;
        }
    }
}



public class ThreadSafety {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        MyThread t3 = new MyThread();
        Thread r1 = new Thread(t1);
        Thread r2 = new Thread(t2);
        Thread r3 = new Thread(t3);
        r1.start();
        r2.start();
        r3.start();
        try {
            r1.join();
            r2.join();
            r3.join();
        } catch (InterruptedException e) {

        }
        System.out.println(MyThread.counter);
    }
}

本来想着counter的输出应该是30000,但是最后conunter的输出的数值是"随机的"并不是固定的30000这就是线程安全问题导致的

为什么?

线程r1,r2,r3共享进程资源,进程和其资源保存在堆内存中,每个线程会单独开辟一个栈内存空间用于存放数据和任务处理,那么在任务处理的过程中,线程就会从进程的堆内存中拷贝共享资源到自己的栈内存中在数据任务处理结束后,再将数据更新到堆内存中。

上面说的是一个线程的工作过程,如果有多个线程,拿取到的是同样资源(未及时更新)并执行相同操作更新呢?这就会导致一个或多个线程白执行任务(多个线程干的是完全相同(拿取的数据相同执行的操作相同))以导致线程安全问题

如何解决线程安全问题?

在最小粒度上,将整个操作原子化 可以使用 Java的隐式锁:synchronized 代码块 提供一个所有线程都可以看到的唯一对象
 

class MyThread implements Runnable{
    static int counter = 0;
    static Object lock = new Object(); //所有线程都可以看到的唯一对象
    @Override
    public void run() {
        for (int i = 0; i < 10000; i++) {
            synchronized (lock) {
                counter++;
            }
        }
    }
}



public class ThreadSafety {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        MyThread t3 = new MyThread();
        Thread r1 = new Thread(t1);
        Thread r2 = new Thread(t2);
        Thread r3 = new Thread(t3);
        r1.start();
        r2.start();
        r3.start();
        try {
            r1.join();
            r2.join();//join本来是插队执行完,因为是执行完,所以这样用可以确保线程执行完毕
            r3.join();
        } catch (InterruptedException e) {

        }
        System.out.println(MyThread.counter);
    }
}

如此通过 synchronized 锁住了++操作(上锁的线程执行完解锁后后面线程才可以执行)后面输出就是30000就解决了问题

为什么我的Win11家庭版找不到BitLocker?教你两种强制关闭加密的隐藏方法 本文解释了Win11家庭版为何缺少BitLocker功能,并提供了两种强制关闭加密的隐藏方法。通过注册表修改和PowerShell命令,用户可以调出隐藏的加密控制面板或直接操控加密引擎,解决家庭版设备加密的管理难题。 阅读详情

相关推荐

GEOSHIELD:分布式CPS的拜占庭容错与安全防护技术

分布式系统在关键基础设施(如轨道交通、智能电网)中面临网络延迟和恶意节点的双重挑战。拜占庭容错(BFT)技术通过算法保证系统在存在故障节点时仍能达成一致,是保障系统安全的核心机制。GEOSHIELD创新性地结合概率化网络延迟测量和TGS动态信任评分,实现了不依赖可信硬件的拜占庭 resilience。该技术通过建立节点行为的信用档案,动态识别恶意行为,在保证安全性的同时最大化系统可用性。实验证明,即使在自适应攻击策略下,GEOSHIELD仍能保持系统95.6%的正常运行时间,为CPS系统提供了可靠的安全防护

weixin_31766003的博客 346

【Linux】线程安全与线程同步

线程安全和死锁,以及线程同步的理解与示例

s_little_monster的博客 9433

流量特征工程实战:基于Python脚本的CIC-FlowMeter批量自动化处理

本文详细介绍了如何利用Python脚本对CIC-FlowMeter工具进行批量自动化封装,实现从海量PCAP文件中高效提取流量特征并生成CSV文件。通过构建健壮的自动化流水线,解决了手动处理效率低下、易出错的问题,并分享了并行处理、错误处理等关键优化技巧,助力网络流量分析与机器学习数据预处理工作。

c6d7e8f9g的博客 744

【JavaEE】线程安全与线程状态

线程安全与线程状态~

做梦都想要三十万年薪~ 2387

基于单片机直流电机调速控制系统设计

*单片机设计介绍,基于单片机直流电机调速控制系统设计。

2201_75940997的博客 2781

DRAM自测试模块

1 背景技术DDR3/4 SDRAM属于高速外设,最高时钟频率可达到1600MHz,最高速率可达3200MT/s。在存储控制器与DDR34 SDRAM设备之间有一层专为高速接口设计的模拟电路,此电路对于前端设计人员来说,不管在模拟验证阶段和回片测试阶段,都是一个黑盒子。而对于后端测试人员来说若此部分为外购IP,则内部结构也是无法清楚了解的。所以在测试阶段,对于DDR34 SDRAM的测试就具有一定的

Hierro的DDR世界 7014

线程安全与线程不安全

1、是线程安全与线程不安全 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据 2、分析 public boolean add(E e) { /** * 添加一个元素时...

leafdown_的博客 8458

Ubuntu20.04系统笔记本网卡AX211无法找到wifi问题

之前电脑的系统是18.04基本上安装好了系统,可以直接连上wifi,在买了拯救者y9000p2022版本之后,因为网卡太新,安装ubuntu18.04或者20.04之后会没有wifi连接,非常不方便。于是上网找了各种帖子去解决这个问题。具体实现有所不同。 主要参考了这个帖子来解决的:http://t.csdn.cn/7807R 首先: sudo apt install flex bison 然后: git clone https://github.com/intel/backpor.

weixin_42825962的博客 1万+

【Linux】线程与线程安全知识总结

本文总结了一些线程的高频知识点。

叫我龙翔的博客 1359

从CCD数据上报看wxHOOK的封号风险与规避

本文深入分析了微信CCD数据上报机制对wxHOOK的检测逻辑与封号风险,揭示了调试器路径暴露、非白名单DLL加载和内存校验失败等关键风险点。通过实战案例和规避方案,帮助开发者理解如何安全使用wxHOOK技术,避免封号风险,包括内存镜像欺骗、内核级隐蔽和硬件辅助方案等高级技巧。

weixin_27875131的博客 629

【数字IC刷题】华为海思数字IC笔试题(1)详细解析版

【数字IC刷题】华为海思数字IC笔试题(1)详细解析版

MoorePlus的博客 4221

线程同步与线程安全

线程同步与线程安全

2302_80190394的博客 737

PLSQL Developer安装详细步骤

一、下载安装PLSQL Developer(plsql安装百度也有步骤) 官网下载地址:https://www.allroundautomations.com/registered-plsqldev/ 1、网上自己下载适合自己电脑的安装包(32或64),并解压。 2、打开解压的文件夹,得到以下三个文件(分别是汉化工具,PLSQL安装包、激活码),双击安装,如下图: 3、安装界面,点击next,进入下一步,如图: 4、安装协议界面,此处必须选择“I accept the terms in

Gorden的博客 11万+

Java--辨别线程安全与线程不安全

在学习Java的时候经常会发现有很多名称相似的类,比如HashMap和Hashtable,StringBuffer和StringBuilder等等,他们的名称相似,功能也有相似的地方,所以初学者在学习之中往往会很疑惑,他们都有哪些不同呢?而在深入研究这个问题的时候,就会发现他们都有这样两个概念,线程安全和线程不安全,这也就是本文主要讲的内容。 1.什么是线程安全和线程不安全呢? 线程安全是指多个...

haigand的专栏 1283

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

线程安全与锁

线程安全与锁 一、什么是进程,什么是线程? ​ 电脑中时会有很多单独运行的程序,每个程序有一个独立的进程,而进程之间是相互独立存在的。 ​ 进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。 二、什么是多线程? ​ 首先要明白什么是串行和并行。 ​ 串行,其实是相对于单条线程来执行多个任务来说的,我们就拿下载文件来举个例子:当我们下载多个文件时,在串行中它是按照一定的顺序去进行下...

weixin_45628213的博客 179

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

iOS——线程安全、线程同步与线程通信

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作(更改变量),一般都需要考虑线程同步,否则的话就可能影响线程安全。

m0_73348697的博客 2621

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

单例模式与线程安全

就是多个线程申请多个未释放的锁,然后他们各自却持有这些锁(未解锁),导致都需要等待对方释放,比如A线程持有锁a,B线程持有锁b,那B今天来申请锁A,A申请锁b,这样A,B线程都需要各自等待对方释放才能申请成功,跟那个shared_ptr的循环引用无法释放一样的道理。第⼀次调⽤GetInstance的时候,如果两个线程同时调⽤,可能会创建出两份T对象的实例, 但是后续再次调⽤,就没有问题了,此时inst就不是空了,不能创建对象了。⼀般⽽⾔,多个线程并发同⼀段只有局部变量的代码时,不会出现不同的结果。

2301_80377335的博客 989

线程安全与锁优化

相对的线程安全就是我们通常意义上所讲的线程安全,它需要保证对这个对象单独的操作是线程安全的,我们在调用的时候不需要做额外的保障措施,但是对于一些特定顺序的连续调用,就可能需要在调用端使用额外的同步手段来保证调用的正确性。上面描述的是轻量级锁的加锁过程,它的解锁过程也是通过 CAS操作来进行的,如果对象的 Mark Word 仍然指向着线程的锁记录,那就用 CAS 操作把对象当前的 MarkWord 和线程中复制的 Displaced Mark Word 替换回来,如果替换成功,整个同步过程就完成了。

qq_32473523的博客 985

Java线程安全与不安全

Java非线程安全与线程安全 ArrayList和Vector的区别在哪里? HashMap和HashTable区别在哪里? StringBuilder和StringBuffer区别在哪里? 张口即答,区别在于前者是非线程安全的,后者是线程是线程安全的。 那么,到底什么叫线程安全?什么叫线程不安全?线程安全不安全的原因是什么?怎么实现线程安全?线程安全和非线程安全有什么区别?分别在什么情况下使用?...

CodeHunter_qcy 2万+

std string与线程安全_正确理解线程安全与非线程安全

引言有没有常被人问到以下几个问题:ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?StringBuilder和StringBuffer有什么区别? 每当听到这样的问题时,答案则无非是来自‘XX面试宝典’的那几句:ArrayList是非线程安全的,Vector是线程安全的HashMap是非线程安全的,HashTable是线程安全的StringBuilder是...

weixin_39918248的博客 324

线程安全与线程池

本文概述了线程安全概念及解决方案。多个线程同时访问和修改共享资源会导致线程安全问题。解决方案是线程同步,核心思想是让线程依次访问共享资源,主要通过加锁实现。介绍了两种加锁方式:同步代码块(锁定核心代码)和同步方法(锁定整个方法),并比较了两者的范围与可读性。同时还介绍了锁对象选择规范、Lock锁、线程池技术及其创建方式(ThreadPoolExecutor和Executors),以及线程池处理Runnable和Callable任务的方法。最后提及了并发与并行的概念。

2402_85679719的博客 658

线程安全与线程同步

线程安全与线程同步 文章目录线程安全与线程同步前言一、什么是线程安全二、线程同步线程同步与原子操作volatile关键字保证线程安全的操作1. synchronized2. synchronized方法3. 手动使用Lock总结 前言 前面已经学习了线程的使用,在使用线程的时候还要注意线程安全。 一、什么是线程安全 假设这样一种场景,如果一个客户在银行有一个账户,客户可以通过柜台,手机app,自助取款机尽情存取款操作。如果某一天客户同一时间点在手机APP和自助取款机进行取钱操作,这个时候就必须有一个机制保证

Xue95111的博客 954
上一篇: 关于JAVA继承
下一篇: 对哲学家就餐问题和死锁问题的一些理解
人机.sout
博客等级 码龄3年 63粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值