006 线程安全

文章目录

  • 临界资源
  • 线程安全
    • 基本概念
      • *何谓竞态条件*
      • *何谓线程安全*
    • 对象的安全
      • 局部基本类型变量
      • 局部的对象引用
      • 对象成员(成员变量)
    • 不可变性

临界资源

临界资源是一次仅允许一个进程使用的共享资源。各进程采取互斥的方式,实现共享的资源称作临界资源。属于临界资源的硬件有,打印机,磁带机等;软件有消息队列,变量,数组,缓冲区等。诸进程间采取互斥方式,实现对这种资源的共享。

线程安全

基本概念

何谓竞态条件

当两个线程竞争同一资源时,如果对资源的访问顺序敏感,就称存在竞态条件。
导致竞态条件发生的代码区称作临界区。
在临界区中使用适当的同步就可以避免竞态条件,如使用synchronized或者加锁机制。

何谓线程安全

允许被多个线程同时执行的代码称作线程安全的代码。线程安全的代码不包含竞态条件。

对象的安全

局部基本类型变量

局部变量存储在线程自己的栈中。也就是说,局部变量永远也不会被多个线程共享。所以,基础类型的
局部变量是线程安全的。下面是基础类型的局部变量的一个例子:


public class ThreadTest {public static void main(String[]args){MyThread share = new MyThread();for (int i=0;i<50;i++){new Thread(share,"线程"+i).start();}}
}
class MyThread implements Runnable{public void run() {int a =0;++a;System.out.println(Thread.currentThread().getName()+":"+a);}
}

无论多少个线程对run()方法中的基本类型a执行++a操作,只是更新当前线程栈的值,不会影响其他线程,也就是不共享数据;

局部的对象引用

对象的局部引用和基础类型的局部变量不太一样,尽管引用本身没有被共享,但引用所指的对象并没有存储在线程的栈内。所有的对象都存在共享堆中。
如果在某个方法中创建的对象不会逃逸出(即该对象不会被其它方法获得,也不会被非局部变量引用到)该方法,那么它就是线程安全的。
实际上,哪怕将这个对象作为参数传给其它方法,只要别的线程获取不到这个对象,那它仍是线程安全的。


public void method1(){LocalObject localObject = new LocalObject();localObject.callMethod();method2(localObject);
}
public void method2(LocalObject localObject){localObject.setValue("value");
}

对象成员(成员变量)

对象成员存储在堆上。如果两个线程同时更新同一个对象的同一个成员,那这个代码就不是线程安全的。


public class ThreadTest {public static void main(String[]args){NotThreadSafe sharedInstance = new NotThreadSafe();new Thread(new MyRunnable(sharedInstance)).start();new Thread(new MyRunnable(sharedInstance)).start();}
}
class MyRunnable implements Runnable{NotThreadSafe instance = null;public MyRunnable(NotThreadSafe instance){this.instance = instance;}public void run(){this.instance.add(" "+Thread.currentThread().getName());System.out.println(this.instance.builder.toString());}
}
class NotThreadSafe{StringBuilder builder = new StringBuilder();public void add(String text){this.builder.append(text);}
}

不可变性

通过创建不可变的共享对象来保证对象在线程间共享时不会被修改,从而实现线程安全。如下示例:


public class ImmutableValue{private int value = 0;public ImmutableValue(int value){this.value = value;}public int getValue(){return this.value;}
}

请注意ImmutableValue类的成员变量 value 是通过构造函数赋值的,并且在类中没有set方法。这意味着一旦ImmutableValue实例被创建, value 变量就不能再被修改,这就是不可变性。但你可以通过getValue()方法读取这个变量的值。

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

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

相关文章

如何使用GPT进行科研:详细指令指南

如何使用GPT进行科研&#xff1a;详细指令指南 随着GPT模型的流行&#xff0c;越来越多的科研人员开始利用这项技术来辅助科学研究&#xff0c;特别是在文本处理任务如论文翻译、文本润色和降低抄袭率方面。本文将提供详细的指令&#xff0c;帮助科研人员有效地使用GPT进行科研…

计算机相关专业入门,高考假期预习指南

一&#xff1a;学习资源推荐 跟着b站的“黑马程序员”学c&#xff0c;黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难_哔哩哔哩_bilibili&#xff0c;把这个编程语言基础打好&#xff0c;然后看“蓝桥杯算法”&#xff0c;到了大一直接就能打蓝桥杯比赛了 看完上面的 …

TRILL简介

介绍TRILL的定义及目的。 定义 TRILL(Transparent Interconnection of Lots of Links)是一种把三层链路状态路由技术应用于二层网络的协议。TRILL通过扩展IS-IS路由协议实现二层路由&#xff0c;可以很好地满足数据中心大二层组网需求&#xff0c;为数据中心业务提供解决方案…

用数组手搓一个小顶堆

堆默认从数组下标为1开始存储。 const int N201000; int heap[N]; int len; 插入操作&#xff1a; 将元素插入到堆的末尾位置向上调整。 void up(int k){while(k>1&&heap[k/2]>heap[k]){swap(heap[k],heap[k/2]);k/2;} } //len为当前存在元素长度 void Inser…

水利水库大坝结构安全自动化监测主要测哪些内容?

在大坝安全自动化监测系统建设中&#xff0c;应根据坝型、坝体结构和地质条件等因素选定监测项目&#xff1b;主要监测对象包括坝体、坝基及有关的各种主要水工建筑物、大坝附近的不稳定岸坡和大坝周边的气象环境。深圳安锐科技建议参考下列表格适当调整。 &#xff08;一&am…

计算机网络(2

计算机网络续 一. 网络编程 网络编程, 指网络上的主机, 通过不同的进程, 以编程的方式实现网络通信(或网络数据传输). 即便是同一个主机, 只要不同进程, 基于网络来传输数据, 也属于网络编程. 二. 网络编程套接字(socket) socket: 操作系统提供的网络编程的 API 称作 “soc…

(0)2024年基于财务的数据科学项目Python编程基础(Jupyter Notebooks)

目录 前言学习目标&#xff1a;学习内容&#xff1a;大纲 前言 随着数据科学的迅猛发展&#xff0c;其在财务领域的应用也日益广泛。财务数据的分析和预测对于企业的决策过程至关重要。 本专栏旨在通过Jupyter Notebooks这一强大的交互式计算工具&#xff0c;介绍基于财务的数…

【车载开发系列】常见单片机调试接口的区别

【车载开发系列】常见单片机调试接口的区别 【车载开发系列】常见单片机调试接口的区别 【车载开发系列】常见单片机调试接口的区别一. JTAG协议二. SWD接口三. RDI接口四. 仿真器1&#xff09;J-Link仿真器2&#xff09;ULink仿真器3&#xff09;ST-LINK仿真器 五. SWD / JTAG…

Day05-组织架构-角色管理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.组织架构-编辑部门-弹出层获取数据2.组织架构-编辑部门-编辑表单校验3.组织架构-编辑部门-确认取消4.组织架构-删除部门5.角色管理-搭建页面结构6.角色管理-获取数…

MySQL中的DDL语句

第一题 输入密码登录mysql&#xff0c;创建数据库zoo&#xff0c;转换到zoo数据库&#xff0c; mysql> create database zoo character set gbk; mysql> use zoo查看创建数据库zoo信息 mysql> show create database zoo;删除数据库zoo mysql> drop database zo…

【后端面试题】【中间件】【NoSQL】MongoDB查询优化2(优化排序、mongos优化)

优化排序 在MongoDB里面&#xff0c;如果能够利用索引来排序的话&#xff0c;直接按照索引顺序加载数据就可以了。如果不能利用索引来排序的话&#xff0c;就必须在加载了数据之后&#xff0c;再次进行排序&#xff0c;也就是进行内存排序。 可想而知&#xff0c;如果内存排序…

【居家养老实训室】:看中医保健在养老中的应用

本文以居家养老实训室为视角&#xff0c;深入探讨了中医保健在养老中的应用。通过对中医保健理念、常用方法以及在居家养老中的具体实践进行分析&#xff0c;阐述了其在改善老年人健康状况、提高生活质量方面的重要作用。同时&#xff0c;也指出了目前应用中存在的问题&#xf…

Apache Kylin模型构建全解析:深入理解大数据的多维分析

引言 Apache Kylin是一个开源的分布式分析引擎&#xff0c;旨在为大数据提供快速的多维分析能力。它通过预计算技术&#xff0c;将数据转化为立方体模型&#xff08;Cube&#xff09;&#xff0c;从而实现对Hadoop大数据集的秒级查询响应。本文将详细介绍Kylin中模型构建的全过…

Windchill的Debug配置

在windchillshell中运行以下命令 xconfmanager -s "wt.manager.cmd.MethodServer.debug.args- agentlib:jdwptransportdt_socket,servery,suspendn,address0.0.0.0:{19}" -p - t codebase/wt.properties xconfmanager -s "wt.manager.cmd.MethodServer.param.19…

2024暑假集训第三次考试

3004. Sleepy Cow Sorting 思路分析 这道题是一道思维题。 这个就要结合之前学习过的算法&#xff0c;看这个题目的排序方式&#xff0c;我们就理所当然的想到了插入排序&#xff0c;也是这道题的正解。只需要看看前面有几个数是无序的就是需要排的次数。转换一下&#xff0c;也…

【第19章】MyBatis-Plus自定义ID生成器

文章目录 前言一、如何自定义二、Spring Boot 集成1. 方式一&#xff1a;声明为Bean供Spring扫描注入2. 方式二&#xff1a;使用配置类3. 方式三&#xff1a;通过MybatisPlusPropertiesCustomizer自定义 三、Spring 集成1. 方式一&#xff1a;XML配置2. 方式二&#xff1a;注解…

【CUDA】 矩阵乘法 matMatMul

矩阵乘法 matMatMul 矩阵乘法是基本线性代数子程序&#xff08;BLAS&#xff09;的重要组成部分&#xff0c;而且线性代数中许多其他操作以此为基础。 图1是两个矩阵的乘法。 基础方法&#xff0c;正方形tile和长方形tile 基础方法 执行矩阵乘法的基础方法是使用单个线程执…

Linux上web服务器搭建(Apache、Nginx)

第五章 web服务器 第一节 DNS&#xff1a;对域名进行解析&#xff0c;查询对应的地址 1.1 web服务器简介 www是world wide web的缩写&#xff0c;也就是全球信息广播的意思 1.2.网址及HTTP简介 web服务器提供的这些数据大部分都是文件&#xff0c;那么我们需要在服务器端…

传统视觉Transformer的替代者:交叉注意力Transformer(CAT)

传统视觉Transformer的替代者:交叉注意力Transformer(CAT) 在深度学习的世界里,Transformer架构以其在自然语言处理(NLP)领域的卓越表现而闻名。然而,当它进入计算机视觉(CV)领域时,却面临着计算成本高昂和推理速度慢的双重挑战。现在,一项革命性的创新——交叉注意…

Qualcomm QCS6490 开发板运行高通AI Hub图像分类程序

相关代码可以在如下链接下载&#xff1a; ai-hub-models/apps/android/ImageClassification at main quic/ai-hub-models GitHub 所用硬件有&#xff1a; 1. UBUNTU20.04 2. 高通QCS6490 开发板 对下载下来的代码进行编译 1. ubuntu环境配置 1. python环境配置 如果你…