JAVA并发编程笔记(4)

Windows10下RTABMAP+T265实现三维建图 win10+rtabmap+t265扫描地形 阅读详情

Thread Confinement

如果数据只被一个线程访问,那自然就不需要同步。所以Thread Confinement是获得线程安全最简单的方式之一。这有几种方式。可以完全依赖于实现,也就是调用者来保证只有单线程访问,但这有可能不是很安全。所以还有其它办法来实现这一点。

Stack Confinement

局部变量必然是线程安全的,只要它们没有escape。局部变量存在于当前线程的栈中,是不能被其它线程所访问的。

ThreadLocal

更正式一些的方式是使用ThreadLocal对象。可以把ThreadLocal看成是每个线程所拥有的一个Map。注意不要滥用ThreadLocal,要慎用,以免影响系统复用性,增加类之间的耦合等等带来不良的设计味道。

Immutability

也可以使用immutable对象来避免同步。immutable对象是指那些在构造完成之后状态就不会改变的对象。Immutable对象总是线程安全的。

An object is immutable if:

  • Its state cannot be modifled after construction;
  • All its flelds are final ;
  • It is properly constructed (the this reference does not escape during construction).

为什么所有field都要求是final的?当然也不一定必须都是final的,比如String。但如果不是final的,会有什么问题,是因为可以继承这个类,然后再修改父类的状态?

安全发布

Improper Publication是很危险的。对于还没有完全构造好就发布的对象而言,可能线程会看到这个对象不一致的状态。

对于Immutable对象,java内存模型提供了一种机制保证共享Immutable对象时的Initialization safety。“Immutable objects can be used safely by any thread without additional synchronization, even when synchronization is not used to publish them.”

要安全发布对象,对象的引用和对象本身的状态必须同时都对其它线程是可见的。安全发布的几种方式:

  • Initializing an object reference from a static initializer;
  • Storing a reference to it into a volatile field or AtomicReference ;
  • Storing a reference to it into a final field of a properly constructed object; or
  • Storing a reference to it into a field that is properly guarded by a lock.

使用static initializer是最简单的方式。

对于非technically immutable,但状态在publication后不会被改变的对象,我们称之为Effectively Immutable。这种对象只要安全发布就可以了,不需要额外的同步。

  • Immutable objects can be published through any mechanism;
  • Effectively immutable objects must be safely published;
  • Mutable objects must be safely published, and must be either threadsafe or guarded by a lock.

安全的共享对象:当你发布一个对象的时候,应该说明这个对象能够如何被访问。下面是最有用的几种policy:

  • Thread-confined. 排他性的属于某个线程,并且可被这个线程修改
  • Shared read-only. 能够并发的多线程访问而无需同步, 但不能被任何线程修改。这包括immutable和effectively immutable对象。
  • Shared thread-safe. 在内部同步, 所以多线程访问时不需同步
  • Guarded. 只能通过特定的锁来访问. Guarded objects include those that are encapsulated within other thread-safe objects and published objects that are known to be guarded by a specific lock.

安全发布这一节没太看明白。需要以后回过头来再读几遍。

在 MATLAB/Simulink 中构建一个固定地面站天线指向控制系统的完整仿真模型 在卫星通信系统中,地面站天线负责与在轨卫星建立高增益、高稳定性的通信链路。对于固定地面站(如卫星测控站、深空站、VSAT主站),天线必须具备高精度指向能力,以确保波束始终对准卫星。然而,卫星(尤其是低轨卫星)在天空中快速移动,地面站天线必须实时跟踪其轨迹。此外,环境扰动(风载、热变形、机械误差)也会导致指向偏差。因此,设计一个高精度、高鲁棒性的天线指向控制系统(Antenna Pointing Control System)至关重要。本文将手把手教你如何在中构建一个固定地面站天线指向控制系统。 阅读详情

相关推荐

从SSTS到CTS:解码汽车电子架构中的需求与实现规范

本文深入解析汽车电子架构中SSTS(子系统功能规范)与CTS(零部件技术规范)的转换过程,揭示从抽象需求到物理实现的关键步骤。通过实际案例说明如何将SSTS的功能逻辑、接口定义和性能指标转化为具体的CTS实施方案,并分享多供应商协同与测试验证的最佳实践,帮助开发者高效完成汽车电子系统开发。

weixin_29201859的博客 498

3.3. Thread Confinement(线程局限)

3.3. Thread Confinement(线程局限) Accessing shared, mutable data requires using synchronization; one way to avoid this requirement is to not share. If data is only accessed from a single thread, no synch...

我的读书笔记 302

发票OFD格式转换成PDF

发票OFD格式转换成PDF

Be_insighted的博客 930

多线程设计模式——Thread Confinement(串行线程封闭)模式

Thread Specific Storage(线程特有存储)模式

buyoufa的博客 2168

PAT|中国大学MOOC-浙江大学翁恺-C语言程序设计习题集(更新中)

##2-0. 整数四则运算 时间限制:400 ms 内存限制:65536 kB 代码长度限制:8000 B 判题程序:Standard 作者:乔林(清华大学) 本题要求编写程序,计算2个正整数的和、差、积、商并输出。题目保证输入和输出全部在整型范围内。 输入格式: 输入在一行中给出2个正整数A和B。 输出格式: 在4行中按照格式“A 运算符 B = 结果”顺序输出和、差、积、商。 输入样例: 3 ...

小鱼波波波 6万+

RPMsg:协议简介

两台计算机可以通过TCP/IP进行通信,那么同一颗芯片上的两个核心怎么通信呢?

SunnyZhou-1024的博客 1万+

JAVA/Android Concurrency学习笔记

Thread SafetyWriting thread-safe code is, at its core, about managing access to state, and in particular to shared, mutable state.An object’s state encompasses any data that can affect its externally v

dkphenix的专栏 1046

广东省道路工程检测练习试题(判断题)真题

按下式计算小于某粒径颗粒质量百分数:X=(A/B)x100( )49.、挖坑灌砂法适用于在现场测定基层(或底基层)、砂石路面及路基土的各种材料压实层的密度和压实度,但不适用于填石路堤等有大孔洞或大孔隙材料的压实度检测。95.挖坑灌砂法适用于在现场测定基层(或底基层)、砂石路面及路基土的各种材料压实层的密度和压实度,但不适用于填石路堤等有大孔洞或大孔隙材料的压实度检测( )107.以干密度 pd 为纵坐标,含水率w为横坐标,绘 pd-w 关系曲线,曲线上峰值点的纵、横坐标分别为最大干密度和最佳含水率( )

ZShy001238的博客 682

多线程面试题_100多线程和Java并发面试问答–最终清单(PDF下载)

多线程面试题 在这篇文章中,我们将提供有关多线程和Java并发面试问答的综合文章。 编者注:并发始终是开发人员的挑战,编写并发程序可能非常困难。 引入并发时,有很多事情可能会崩溃,并且系统的复杂性会大大增加。 但是,编写健壮的并发程序的能力是开发人员的必备工具,并且可以帮助构建复杂的企业级应用程序。 在本文中,我们将讨论可以在编程面试中使用的不同类型的问题,以评估候选人对并发和多线程的理...

cunfeng7797的博客 1501

Matplotlib之bar3d画3D柱状图

3D柱状图通常用于展示数据集中不同分类项的数据大小或数量。与普通的柱状图相比,3D柱状图更适合展示数据的三个维度 3D 柱状图 按行/列涂颜色 柱加阴影、描黑边 自定义座标轴名、刻度标签、范围

我走的每一步都算数 1120

SPICE仿真软件:PSpice_(10).噪声分析

噪声分析是电路设计和优化中的一个重要工具,特别是在低噪声放大器、传感器电路和通信电路中。通过准确设置噪声源和仿真参数,合理选择频率范围,并验证仿真结果,可以有效地评估和优化电路的噪声性能。PSpice提供的噪声分析功能强大且灵活,能够帮助工程师和研究人员在多种应用场景下进行详细的噪声分析。

kkchenjj的博客 1535

Java并发编程实战(学习笔记二 第三章 对象的共享)

(转自:https://blog.youkuaiyun.com/ahaha413525642/article/details/76574351 侵删)本章将介绍如何共享和发布对象,从而使它们嫩能够安全地由多个线程同时访问。3.1 可见性(Visibility)通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至不可能。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制。下面的 N...

weixin_41704428的博客 860

外设测试 - ATAES132A 加解密芯片测试

原理 使用芯片官方提供的读写操作库,进行先写后读并校验,确认数据一致。 示例代码 int main(void) { uint8_t ret; aes132p_enable_interface(); ret = write_memory_test(); if (ret != AES132_FUNCTION_RETCODE_SUCCESS) { aes132p_disable_interface(); printf

一个软件工程师的技术笔记 858

《Java并发编程的艺术》读后笔记-part4

现代操作系统在运行一个程序时,会为其创建一个进程。现代操作系统调度的最小单元是线程,也叫轻量级进程。在一个进程里可以创建多个线程,这些线程都拥有各自的计数器、堆栈和局部变量等属性,并且能够访问共享的内存变量。处理器在这些线程上高速切换,让使用者感觉到这些线程在同时执行。一个Java程序从main()方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际上Java程序天生就是多线程程序,因为执行main()方法的是一个名称为main的线程。

2401_85767200的博客 799

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【学习笔记】Java并发编程的艺术——第4章 Java并发编程基础

操作系统调度的最小单位,有自己的计数器栈、局部变量、共享内存。

Lchen_kk的博客 408

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java并发编程实战笔记—— 并发编程4

1、同步容器类   同步容器类都是线程安全的,但在某些情况下可能需要额外的客户端加锁保护复合操作。   容器上常见的复合操作包括但不限于:迭代(反复访问数据,直到遍历完容器中所有的元素为止)、跳转(根据指定顺序找到当前元素的下一个元素)以及条件运算(例如:如果没有则添加)。   这些复合操作在没有客户端加锁的情况下仍然是线程安全的,但是当其他现场并发的修改容器时,它们就可能出现意料之外的行...

weixin_30443731的博客 88

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java并发编程实战读书笔记-Chapter4

到目前为止,我们已经介绍了关于线程安全与同步的一些基础知识。然而,我们并不希望对每一次内存访问都进行分析以确保程序说线程安全的,而是希望将一些现有的线程安全组件组合成为更大规模的组件或程序。本章将介绍一些组合模式,这些模式能够使一个类更容易成为线程安全的,并且在维护这些类时不会无意中破坏类的安全性保证。

weixin_42583701的博客 301

Java并发编程学习笔记4——共享模型之内存

JMM(JavaMemoryModel),它定义了主存、工作内存等抽象概念,底层对应着CPU寄存器、缓存、硬件内存、CPU指令优化等。

weixin_44623055的博客 316

Java并发编程学习笔记(4)

第三部分:活跃度、性能和测试 10 避免活跃度危险 如果所有线程以通用的固定秩序获得锁,程序就不会出现顺序锁死锁问题了。 当调用的方法不需要持有锁时,这被称为是“开放调用”。依赖于开放调用的类会具有更好的行为,并且比那些需要获得锁才能调用的方法相比,更容易与其他类合作。   在程序中尽量使用开放调用,依赖于开放调用的程序,相比于那些在持有锁时还调用外部方法的程序,更容易执行死锁自由度的...

hebeind100的博客 181

JAVA多线程并发编程学习笔记4——线程池

JAVA并发编程 7. 线程池 7.1 概念 7.1.1 无限制创建线程的缺点 线程生命周期的开销(创建和关闭线程等开销) 活动线程消耗系统资源,大量空闲线程占用更多内存,给垃圾回收器带来压力。 过多的线程会影响稳定性,甚至拖垮程序。 7.1.2 简单过程和优点 过程:线程池管理一个工作者线程的同构池,并与工作队列绑定。它从工作队列中获取下一个任务并执行。 优点: 可以重用线程,减少创建和关闭线程的开销。 提高响应性,不需要创建线程也就不会延迟任务的执行。 通过调整线程池大小,可以保持处理器

WellsLau的博客 608

Java并发编程之美 chap4 原子性操作类源码剖析笔记

4-1 原子变量操作类 文章目录4-1 原子变量操作类1.递增和递减操作代码2. boolean CompareAndSet方法3.例子 这种类的作用其实就是 在线程之中调用这个类,向它的构造函数传递一个value(注意,这个value可能是一个偏移量引用,而不仅仅只是一个Long值) 然后用这个类的方法对这个值进行原子性的递增递减操作。 以AtomicLong类来详细分析源码 (好像书中用的版本的代码和我现在使用的又不一样了,我现在用书中的代码) 构造函数为: public AtomicLong(

m0_51072212的博客 129

Java并发编程实战笔记(4)-基础构建模块

Java并发编程实战笔记(4)-基础构建模块

paraller_15的博客 258

读书笔记-java并发编程的艺术3-4章

volatile的内存语义 可见性:对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入。 原子性:如果是多个volatile操作或类似于volatile++这种复合操作,整体上不具有原子性 当第二个操作是volatile写时,不管第一个操作是什么,都不能重排序。这个规则确保volatile写之前的操作不会被编译器重排序到volatile写之后 当第一...

qq_32094709的博客 182

[笔记][Java7并发编程实战手册]4.4 在执行器中执行任务并返回结果Callable、Future

[笔记][Java7并发编程实战手册]系列目录简介  执行框架(Executor Framework)的优势之一就是,可以在运行并发任务的时候返回结果。但是需要以下两个类来实现功能:    1. 接口 Callable<V> 返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 call 的方法。 Callable 接口类似于 Runnable,两者都是为那些其实例可

代码有毒的博客 1637

[笔记][Java7并发编程实战手册]系列第四章 4.1 简介

[笔记][Java7并发编程实战手册]系列目录好把。这一章的任务感觉好难,自己也没有了解过,只能跟着书上的多测试了。第四章在本章中,我们将学习: 1. 创建线程执行器 2. 创建固定大小的线程执行器 3. 在执行器中执行任务并返回结果 4. 运行多个任务并处理第一个结果 5. 运行多个任务并处理所有结果 6. 在执行器中延时执行任务 7. 在执行器中周期性执行任务 8. 在执行器中取

代码有毒的博客 1253

github神仙级java后端_先睹为快!Github上一些超火的Java并发编程神仙笔记

并发编程谈到并发编程,可能很多人都有过经验,甚至比我了解的更多。那么并发与并行的区别又是什么?并发编程是编程中的核心问题,实践中,当人们希望利用计算机处理一些现实世界问题,以及希望同时处理多个问题的时候,并发也就出现了。在需要对同一共享资源进行操作,多个事务之间存在关联,人们把这种看起来多个事务同时运行的特性称为并发性。有个经常容易跟并发混肴的概念叫并行,其实真正懂了之后理解并不困难,可以把并行看...

weixin_31834087的博客 162
上一篇: JAVA并发编程笔记(3)
下一篇: spring boot集成shiro,使用java annotation配置而不是xml配置的经验
windsome
博客等级 码龄19年 5粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值