01_多线程与线程安全

电感选型不当的代价:从纹波激增到系统失稳的深度剖析 本文深度剖析了电感选型不当对开关电源系统的严重影响。电感值过小会导致纹波电流激增、元件热应力加剧、EMI超标乃至MOSFET击穿;电感值过大则会引起环路响应迟滞、动态性能下降和轻载效率恶化。文章通过实测案例,强调了超越经典公式进行动态与容差考量的必要性,并提供了基于饱和电流、温升电流及环路测试的精准选型方法论,帮助工程师规避从纹波失控到系统失稳的潜在风险。 阅读详情

多线程

什么是多线程

多线程是指从软硬件上实现的多条执行流程的技术(多条线程由 CPU 负责调度执行)

多线程的创建方式一(继承 Thread 类)
  • 优点:写代码的逻辑清晰、简单
  • 缺点:线程类已经继承 Thread,无法继承其他类,不利于功能的扩展
public class Test {
    public static void main(String[] args) {
        // 3. 创建 MyThread 线程类的对象代表一个线程
        Thread t = new MyThread();
        // 4. 启动线程
        t.start();

        for (int i = 0; i < 5; i++) {
            System.out.println("主线程 main 输出: " + i);
        }
    }
}

// 1. 让子类继承 MyThread 线程类
class MyThread extends Thread {
    // 2. 必须重写 Thread 类的 run 方法
    @Override
    public void run() {
        // 线程要执行的任务
        for (int i = 0; i < 5; i++) {
            System.out.println("子线程 MyThread 输出: " + i);
        }
    }
}
多线程的创建方式二(实现 Runnable 接口)
  • 优点:任务类只是实现接口,可以继续继承其他类,实现其他接口,扩展性强
  • 缺点:需要多一个 Runnable 对象
// 普通写法

public class Test {
    public static void main(String[] args) {
        // 3. 创建任务对象
        Runnable target = new MyRunnable();
        // 4. 把任务对象交给一个线程对象处理
        new Thread(target).start();

        for (int i = 0; i < 5; i++) {
            System.out.println("主线程 main 输出: " + i);
        }
    }
}

// 1. 定义一个任务类,实现 Runnable 接口
class MyRunnable implements Runnable {
    // 2.重写 Runnable 类的 run 方法
    @Override
    public void run() {
        // 线程要执行的任务
        for (int i = 0; i < 5; i++) {
            System.out.println("子线程 MyRunnable 输出: " + i);
        }
    }
}
// 匿名内部类写法(即上面代码的简洁版)

public class Test {
    public static void main(String[] args) {
        // 1. 直接创建 Runnable 接口的匿名内部类形式(任务对象)
//        Runnable target = new Runnable() {
//            @Override
//            public void run() {
//                // 2. 在这里写好线程要执行的任务
//                for (int i = 0; i < 5; i++) {
//                    System.out.println("子线程输出: " + i);
//                }
//            }
//        };
//        new Thread(target).start();

        // 简化形式1:
//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                for (int i = 0; i < 5; i++) {
//                    System.out.println("子线程输出: " + i);
//                }
//            }
//        }).start();

        // 简化形式2:
        new Thread(() -> {
            for (int i = 0; i < 5; i++) {
                System.out.println("子线程输出: " + i);
            }
        }).start();

        for (int i = 0; i < 5; i++) {
            System.out.println("主线程输出: " + i);
        }
    }
}
多线程的创建方式三(实现 Callable 接口)
  • JDK 5.0 提供了 Callable 接口和 FutureTask 类来实现
  • 优点:(1)线程任务类只是实现接口,可以继承其他类和实现接口,扩展性强;(2)最大的优点——可以返回线程执行完毕后的结果
  • 缺点:写代码相对复杂一些
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class Test {
    public static void main(String[] args) throws Exception {
        // 3. 创建 Callable 对象
        Callable<String> call = new MyCallable(100);

        // 4. 把对象封装成一个 FutureTack 对象(任务对象)
        // 未来任务对象的作用?
        // a.是一个任务对象,实现了 Runnable 对象
        // b.可以在线程执行完毕之后,用未来任务对象调用get方法获取线程执行完毕后返回的结果
        FutureTask<String> task = new FutureTask<>(call);

        // 5. 把任务对象交给一个 Thread 对象
        new Thread(task).start();

        // 6. 获取线程执行完毕后返回的结果
        // 注意:如果执行到这里,假如上面的线程还没执行完毕
        // 这里的代码会暂停,等待上面的线程执行完毕才会去获取结果
        String res = task.get();
        System.out.println(res);
    }
}

// 1. 让这个类实现 Callable 接口
class MyCallable implements Callable<String> {
    private int n;

    public MyCallable(int n) {
        this.n = n;
    }

    // 2. 重写 call 方法
    @Override
    public String call() throws Exception {
        // 在这里写线程的任务,返回线程执行完毕的结果
        // 需求:求 1 ~ n 的和
        int sum = 0;
        for (int i = 0; i <= n; i++) {
            sum += i;
        }
        return "1到" + n + "的和是:" + sum;
    }
}
Thread 常用方法
  • 获取线程的名字
public class Test {
    public static void main(String[] args) {
        Thread t1 = new MyThread();
        t1.start();
        System.out.println(t1.getName());  // 获取t1线程的名字  Thread-0

        Thread t2 = new MyThread();
        t2.start();
        System.out.println(t2.getName());  // 获取t2线程的名字  Thread-1

        System.out.println(Thread.currentThread());  // 获取当前线程的名字(当前代码所在的线程是主线程)  Thread[main,5,main]
        for (int i = 0; i < 3; i++) {
            System.out.println("主线程输出>>> " + i);
        }
    }
}

class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println("子线程输出>>> " + i);
        }
    }
}
  • 设置线程名字的两种方法、主线程等待、线程的暂停操作
public class Test {
    public static void main(String[] args) throws Exception {
        Thread t1 = new MyThread();
        t1.setName("1号线程");  // 为线程取名字
        t1.start();
        t1.join();  // 让主线程等待t1线程执行完才继续往下执行
        System.out.println("------");

        Thread t2 = new MyThread("2号线程");    // 为线程设置名字的第二种方法(记得重写构造器)
        t2.start();
//        t2.join();

        Thread t = Thread.currentThread();
        t.setName("主线程");
        for (int i = 0; i < 3; i++) {
            System.out.println(t.getName() + "输出>>> " + i);
        }
    }
}

class MyThread extends Thread {
    public MyThread() {

    }

    public MyThread(String name) {
        super(name);  // 为线程设置名字的第二种方法
    }

    @Override
    public void run() {
        try {
//            Thread.sleep(5000);  // 让当前的线程,先暂停5000毫秒(5秒)
            Thread t = Thread.currentThread();
            for (int i = 0; i < 3; i++) {
                System.out.println(t.getName() + "输出>>> " + i);
            }

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

线程安全

什么是线程安全

多个线程,同时操作同一个共享资源的时候,可能会出现业务安全问题

取钱问题的引出
public class Test {
    public static void main(String[] args) {
        // 1. 创建一个账户对象,代表两个人的共享账户
        Account account = new Account("ICBC-110", 1000);

        // 2. 创建两个线程,分别代表小明、小红,再去同一个账户对象中取钱1千
        new MyThread("小明", account).start();  // 小明
        new MyThread("小红", account).start();  // 小红
    }
}

class MyThread extends Thread {
    private Account account;

    public MyThread(String name, Account account) {
        super(name);
        this.account = account;
    }

    @Override
    public void run() {
        // 取钱
        account.drawMoney(1000);
    }
}

class Account {
    private String cardId;
    private double money;

    public Account() {
    }

    public Account(String cardId, double money) {
        this.cardId = cardId;
        this.money = money;
    }

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    // 取钱功能
    public void drawMoney(double money) {
        String name = Thread.currentThread().getName();  // 获取线程的名字,判断是谁来取钱了
        // 判断余额是否足够
        if (this.money >= money) {
            System.out.println(name + "取钱成功,金额:" + money + "元");
            this.money -= money;
            System.out.println(name+"取钱后,余额为 " + this.money + "元");
        } else {
            System.out.println(name + "取钱失败,余额不足");
        }
    }
}
// 上述代码的运行结果:

// 小红取钱成功,金额:1000.0元
// 小明取钱成功,金额:1000.0元
// 小明取钱后,余额为 -1000.0元
// 小红取钱后,余额为 0.0元
取钱问题的解决

线程同步:解决线程安全问题的方案

线程同步的思想:让多个线程实现先后依次访问共享资源,从而解决了安全问题

线程同步的常见方案:

  • 加锁:每次只允许一个线程加锁,加锁后才能进入访问,访问完毕后自动解锁,然后其他线程才能加锁进来

加锁的场景方式:

  • 方式一:同步代码块
  • 方式二:同步方法
  • 方式三:Lock 锁
同步代码块

锁对象的使用规范

  • 建议使用共享资源作为锁对象,以确保 “锁” 的唯一性和正确的作用域,对于实例方法建议使用 this 作为锁对象
  • 对于静态方法建议使用字节码(类名.class)对象作为锁对象
synchronized(" 请在这里填写‘锁对象’ "){
    被上锁(被同步的)代码块......
}
public class Test {
    public static void main(String[] args) {
        // 1. 创建一个账户对象,代表两个人的共享账户
        Account account = new Account("ICBC-110", 1000);

        // 2. 创建两个线程,分别代表小明、小红,再去同一个账户对象中取钱1千
        new MyThread("小明", account).start();  // 小明
        new MyThread("小红", account).start();  // 小红
    }
}

class MyThread extends Thread {
    private Account account;

    public MyThread(String name, Account account) {
        super(name);
        this.account = account;
    }

    @Override
    public void run() {
        // 取钱
        account.drawMoney(1000);
    }
}

class Account {
    private String cardId;
    private double money;

    public Account() {
    }

    public Account(String cardId, double money) {
        this.cardId = cardId;
        this.money = money;
    }

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    // 取钱功能
    public void drawMoney(double money) {
        String name = Thread.currentThread().getName();  // 获取线程的名字,判断是谁来取钱了
        // 判断余额是否足够
        synchronized (this) {
            if (this.money >= money) {
                System.out.println(name + "取钱成功,金额:" + money + "元");
                this.money -= money;
                System.out.println(name+"取钱后,余额为 " + this.money + "元");
            } else {
                System.out.println(name + "取钱失败,余额不足");
            }
        }
    }
}
同步方法

同步方法的底层原理:

  • 同步方法的底层其实也是由隐式锁对象的,只是锁的范围是整个方法代码
  • 如果方法是实例方法:同步方法默认用 this 作为锁对象

"同步代码块"好还是"同步方法"好?

  • 范围上:"同步代码块"锁的范围更小,性能更好
  • 可读性上:同步方法更好
public class Test {
    public static void main(String[] args) {
        // 1. 创建一个账户对象,代表两个人的共享账户
        Account account = new Account("ICBC-110", 1000);

        // 2. 创建两个线程,分别代表小明、小红,再去同一个账户对象中取钱1千
        new MyThread("小明", account).start();  // 小明
        new MyThread("小红", account).start();  // 小红
    }
}

class MyThread extends Thread {
    private Account account;

    public MyThread(String name, Account account) {
        super(name);
        this.account = account;
    }

    @Override
    public void run() {
        // 取钱
        account.drawMoney(1000);
    }
}

class Account {
    private String cardId;
    private double money;

    public Account() {
    }

    public Account(String cardId, double money) {
        this.cardId = cardId;
        this.money = money;
    }

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    // 取钱功能
    // 加上 synchronized 关键字,此方法就变成同步方法了
    public synchronized void drawMoney(double money) {
        String name = Thread.currentThread().getName();  // 获取线程的名字,判断是谁来取钱了
        // 判断余额是否足够
        {
            if (this.money >= money) {
                System.out.println(name + "取钱成功,金额:" + money + "元");
                this.money -= money;
                System.out.println(name + "取钱后,余额为 " + this.money + "元");
            } else {
                System.out.println(name + "取钱失败,余额不足");
            }
        }
    }
}
Lock 锁

Lock 锁是 JDK 5 开始提供的一个新的锁定操作,通过它可以创建出锁对象进行加锁和解锁,更灵活、更方便、更强大

Lock 是接口,不能直接实例化,可以采用它的实现类 ReentranLock 来构建 Lock 锁对象

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Test {
    public static void main(String[] args) {
        // 1. 创建一个账户对象,代表两个人的共享账户
        Account account = new Account("ICBC-110", 1000);

        // 2. 创建两个线程,分别代表小明、小红,再去同一个账户对象中取钱1千
        new MyThread("小明", account).start();  // 小明
        new MyThread("小红", account).start();  // 小红
    }
}

class MyThread extends Thread {
    private Account account;

    public MyThread(String name, Account account) {
        super(name);
        this.account = account;
    }

    @Override
    public void run() {
        // 取钱
        account.drawMoney(1000);
    }
}

class Account {
    private String cardId;  // 卡号
    private double money;  // 钱
    // 创建了一个锁对象(每个银行卡都应该有一个对应的锁)
    private final Lock lk = new ReentrantLock();

    public Account() {
    }

    public Account(String cardId, double money) {
        this.cardId = cardId;
        this.money = money;
    }

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    // 取钱功能
    public void drawMoney(double money) {
        String name = Thread.currentThread().getName();  // 获取线程的名字,判断是谁来取钱了
        lk.lock();  // 加锁(加锁的前提是:一定要确保可以解锁!)
        // 判断余额是否足够
        try {
            {
                if (this.money >= money) {
                    System.out.println(name + "取钱成功,金额:" + money + "元");
                    this.money -= money;
                    System.out.println(name + "取钱后,余额为 " + this.money + "元");
                } else {
                    System.out.println(name + "取钱失败,余额不足");
                }
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            lk.unlock();  // 解锁
        }

    }
}
Unity 佳能SDK 及数据获取 3. 把CameraControl 下面只要是绿色的 .cs 文件都复制到Unity 中。1. 填写信息跟官方申请SDK,大概1-2个工作日会邮件回复你。2. 将SDK这两个文件放到 Unity Plugins文件夹。 阅读详情

相关推荐

ESP32固定翼航模硬件设计与飞行力学解析

固定翼无人机是嵌入式控制与空气动力学交叉实践的经典载体,其飞行稳定性本质源于重心、气动中心与控制面的物理耦合关系。理解静稳定度(Static Margin)、升力系数调控、偏航力矩生成等基础原理,是实现可靠姿态控制的前提。在低成本工程约束下,材料刚度、结构弹性与电机-驱动协同设计共同决定了系统动态响应边界。ESP32平台凭借高精度PWM、低功耗双模无线及丰富GPIO,成为教学级航模开发的理想主控;而魔术贴基板、可调电池配重、柔性尾翼等创新结构,则将抽象的飞行力学概念转化为可测量、可调试的实体对象,广泛应用于

weixin_29859471的博客 365

muduo网络库:01---线程安全的对象生命期管理之(多线程中对象的构造与析构)

编写线程安全的类不是难事,用同步原语保护内部状态即可。但是对象的生与死不能由对象自身拥有与的mutex(互斥器)来保护 如何避免对象析构时可能存在的race condition(竞态条件)是C++多线程编程面临的基本问题,可以借助Boost库中的shared_ptr和weak_ptr完美解决。这也是实现线程安全的Observer模式的必备技术 一、当析构函数遇到多线程 与其他面向对象语言不...

董哥的黑板报 1954

【ENVI初学】查看影像空间分辨率及重采样

例如,如果线段长度为900米,对应的像素数量为30个,那么影像的空间分辨率为30米。通过计算长度与像素数量的比值,即可得到影像的空间分辨率。,在弹出的对话框中,输入重采样后输出文件的xy分辨率大小。在测量结果窗口中,可以看到该线段的长度以及角度。在影像上点击并拖动鼠标,绘制一条直线段。工具,选择要重采样的影像后点击ok。,避免了插值过程中光谱信息的改变。:最近邻插值法通过选择原始影像中。在ENVI中打开影像后右键选择。指示了每个像素的地理跨度(聚合为一个新像素,通常通过。方法一:查看影像的元数据。

weixin_41619112的博客 5571

Java基础27,28(多线程,ThreadMethod ,线程安全问题,线程状态,线程池)

现代操作系统(Windows,macOS,Linux)都可以执行多任务。多任务就是同时运行多个任务。例如:播放音乐的同时,浏览器可以进行文件下载,同时可以进行QQ消息的收发。CPU执行代码都是一条一条顺序执行的,但是,即使是单核CPU,也可以同时运行多个任务。因为操作系统执行多任务实际上就是让CPU对多个任务轮流交替执行。操作系统轮流让多个任务交替执行,例如,让浏览器执行0.001秒,让QQ执行0.001秒,再让音乐播放器执行0.001秒。在用户使用的体验看来,CPU就是在同时执行多个任务。

qq_52897007的博客 2773

winedt + miktex + SumatraPDF 搭建latex环境

整个环境包含三部分: - winedt: 前端编辑器 - miktex: 后端编译器 - SumatraPDF: 预览器顺序无关紧要, 不过如果先装miktex的话, 可能会被winedt在安装的时候自动找到路径从而不需要设置.1.安装miktex首先在latex-project官网, 打开”get”后, 有四种平台: Linux, Mac OS, Windows, Online. 我写论文

Iteration makes perfection. 6462

tkinter使用label视频播放

tkinter是python的界面开发包 使用tkinter显示视频流的一个办法是使用label来逐帧显示图片。 from Tkinter import * from PIL import ImageTk, Image import cv2 root = Tk() # Create a frame app = Frame(root, bg="white") app.grid() # Create a label in the frame lmian = Label(app) lmain.grid(

六十英里的专栏 5526

java多线程_01(什么是多线程、线程安全)偏理论

目录 前言 多线程的知识点算是比较难啃的骨头,仅凭一篇文章很难把知识点系统的梳理完,所以多线程这个章节我分了理论篇和实操篇来解说梳理。该篇为理论篇,认识多线程的起点,后续我再抽时间继续跟进! 一、什么是java多线程 (一)、进程与线程 1、进程(一个运行的程序就是一个进程,进程之间资源不能共享) 2、线程(一个进程中包含1~n个线程,同类线程间资源共享) (二)、什么是多线程 1、串行 2、并行 并行与并发的区别(附加): 多线程: 二、线程安全 (一)、什么是线程安全 线..

m0_57789266的博客 2905

【BigWorld 游戏服务器引擎】Cell 架构设计介绍,及Java实现方案的探索

横向扩展(Scalability):通过动态增减CellApp和BaseApp的数量,可以轻松应对玩家人数的变化。世界可以做得非常大,只需增加更多的 Cell。负载分离(Load Separation):将不同性质的负载分离,避免了单一进程瓶颈。CPU 密集型的实时计算(CellApp)和 I/O 密集型的数据操作(BaseApp)互不影响。高效的视野管理(AOI):每个 Cell 只关心自己区域内和边界上的实体,大大降低了计算复杂度。容错性:某个CellApp。

代码时光 1205

多线程、线程安全

[@Toc]

Tower_SHR的博客 2263

SenseVoice 实测,阿里开源语音大模型,识别效果和效率优于 Whisper,居然还能检测掌声、笑声!5分钟带你部署体验

阿里开源语音大模型:语音识别效果和性能强于 Whisper,还能检测掌声、笑声、咳嗽等

u010522887的专栏 4万+

手把手教你用微信小程序实现智能硬件音视频通话(含Linux/RTOS适配)

本文详细介绍了如何利用微信小程序硬件框架(WMPF)和音视频SDK,在智能硬件(包括Linux与RTOS设备)上实现音视频通话功能。文章从架构设计、设备端SDK集成、小程序VOIP插件开发到跨平台调试与性能优化,提供了全链路实战指南,帮助开发者打通微信小程序与嵌入式设备间的实时音视频通信。

ooo22的博客 329

【重难点】【JUC 01】线程安全都体现在哪些方面 、如何维护线程安全、多线程的同步方法、多线程通信方式、AQS

线程安全都体现在哪些方面 、如何维护线程安全、多线程的同步方法、多线程通信方式、AQS

2022年毕业的萌新程序猿,输出一下自己的学习内容~ 661

人工智能机器学习基础篇】——深入详解强化学习 基础知识,理解马尔可夫决策过程(MDP)、策略、价值函数等关键概念

人工智能机器学习基础篇】——深入详解强化学习 基础知识,理解马尔可夫决策过程(MDP)、策略、价值函数等关键概念

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 1925

多线程线程安全

这里是引用 12333555448845525

lipengzhong 398

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

多线程以及线程安全

最近在面试终于到很多面试官再问多线程的问题,所以这里就对多线程做一个总结,我引入了别人的一些博客。 转自: https://blog.youkuaiyun.com/beidaol/article/details/89135277 什么是进程? 电脑中时会有很多单独运行的程序,每个程序有一个独立的进程,而进程之间是相互独立存在的 什么是线程? 进程想要执行任务就需要依赖线程。换句话说,就是进程中...

liuying1802028915的博客 378

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

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

java多线程与线程安全问题

/1.重写run方法:现成的执行任务@Overridei < 20;i++) {//1.创建线程对象//2.开启线程 ---当获取到cpu时间片,那么该线程就会执行run方法的任何代码//多线程//一个线程,先执行run,在执行mainj < 30;j++) {获取当前线程的名称第一种: 通过父类Thread中的getName()可以获取线程名称。必须为Thread的子类。

elicious的博客 682

精雕软件(JDpaint) 5.5 绿色版

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

多线程与高并发之线程安全

线程安全 需求 使用两个线程模拟火车站两个窗口同时买票的场景 初步实现方案 定义一个全局变量count=100,定义一个线程run方法中实现买票的模拟操作(count–),最后在测试方法中定义两个线程并启动,实现买票操作;代码如下: public class ThreadTest01 implements Runnable { private Integer count = 10; private Object obj = new Object(); public void r

jiangzhou556的博客 394

【Java多线程】线程安全问题

Java线程安全问题

weixin_62533201的博客 1128

java多线程(十)使用线程安全的集合

在多线程中,如果要并发的修改一个数据结构,那么很有可能会破坏这个数据结构。例如,一个线程可能要向一个散列表中插入一个元素,假如在调整各个桶之间的链接关系时被剥夺了控制权,而此时正好有另外一个线程正在遍历链表,则可能会产生异常或者死循环。 可以通过锁来保护共享的数据结构,但是选择线程安全的实现作为替代可能更容易一些。 一、旧的线程安全的集合 任何集合类都可以通过使用同步包装器变成线程安全的:

xingjiarong的专栏 3万+

Java多线程基础(01) ———— 线程安全和锁Synchronized概念

目录 第01课 线程安全和锁 Synchronized 概念 进程与线程的概念 进程和线程的关系 线程和进程各自有什么区别和优劣 同步与异步 并行与并发 Java 实现多线程方式 线程安全 Synchronized 修饰符 一个对象有一把锁,多个线程多个锁! 对象锁的同步和异步 Synchronized 应用 第01课 线程安全和锁 Synchronized 概念 进程...

分享 280

01-多线程案例-线程安全问题

在多线程编程中,线程安全问题常因多个线程同时访问或修改共享资源而导致数据不一致或状态错误。为应对这一问题,常见的策略包括使用同步机制和无锁数据结构。synchronized 关键字是最简单的同步方式,确保同一时刻只有一个线程访问共享资源。ReentrantLock 提供了更灵活的锁控制,支持超时和尝试锁等功能。对于高并发场景,无锁数据结构如 ConcurrentHashMap 能够减少锁竞争,提升性能。选择适当的策略取决于具体需求,如代码复杂度、性能要求和锁控制的精细程度。

有时间就写写代码 468

11.多线程4(线程安全)

线程安全问题指的是多个线程同时操作同一个共享资源导致出现不正确的结果或者抛出异常的问题,这种问题通常发生在并发编程中,因为多个线程在执行过程中它们的执行顺序和执行时间是不确定的,如果不加以控制就有可能数据安全问题底层核心原因主要有三个原子性多线程并发编程的原子性是指一组指令被执行时,不受其他指令的干扰,比如我们说 CAS (Compare & Set)是原子的,java.util.concurrent.atomic 下的原子操作类等,这里的原子性其实指的是隔离性,也就是一组操作不能被别的线程干扰有序性可见性

u011488477的博客 1154

java多线程并发之旅-01-多线程并发教程概览

本系列学习目的 提升对于 java 多线程的理解,要学会横向对比学习,多看些文章。 目前大部分的文章都是止步于创建和常见的类,本系列重在实践,参考书籍《java 并发编程实战》《Java并发编程的艺术》 后续原理参考《深入理解并行编程》。 对于 java 多线程的基础知识,参考 Java Thread 小结 经典书籍《图解 Java 多线程设计模式》 系列学习笔记。 对于 jvm 相关知识不用重复...

1万+

5招教你实现多线程场景下的线程安全!

摘要:多线程(并发)场景下,如何编写线程安全(Thread-Safety)的程序,对于程序的正确和稳定运行有重要的意义。下面将结合示例,谈谈如何在Java语言中,实现线程安全的程序。

华为云官方博客 1272

【Linux多线程服务端编程】| 【01】线程安全的对象生命期管理笔记

【死锁】:若L62中的update调用register_或unregister,若mutex_是不可重入,则会死锁;】:若销毁,则无法访问,无法获取对象状态,也可能在源地址上创建新的对象;【空悬指针】:当两个指针指向同一个对象,不同线程将其中一个对象销毁,而另外一个就成了空悬指针;解释:弱该对象还活着,即调用它的成员函数,否则忽略之,利用weak_ptr;【shared_ptr】:当对象最后一个时,进行析构或reset会被销毁;通过继承该基类,来确保上述的问题,即在bind中,传入的this还存活着;

weixin_45926547的博客 1011

【Spring篇01】:Bean的线程安全问题总结

Spring框架中的单例Bean默认非线程安全,需开发者根据场景处理并发问题。核心解决方案包括:①优先设计无状态Bean(无成员变量);②使用ThreadLocal或并发工具类(如AtomicLong)管理线程级/共享状态;③避免滥用prototype作用域。典型案例表明,统计类服务推荐Atomic原子类,用户会话数据适用ThreadLocal。关键原则是:单例Bean的线程安全取决于设计,应避免可变状态,必要时采用最小化同步策略。

lyh2004_08的博客 1353
上一篇: 16_日志技术
下一篇: 02_线程通信与线程池
code_stream
博客等级 码龄4年 1238粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值