同步访问共享数据【Effective java第10章】

《effective java》66:同步访问共享的可变数据 1 public class ConcurrentAccessShareVariable66 { private static boolean stopFlag; public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(new Runn... 阅读详情
在多线程编程时会涉及到共享数据的问题,以下是个人学习的一个小例子。
我们希望程序在一秒后结束,然而第一种却永远不会停止运行。
import java.math.BigDecimal;
import java.util.concurrent.TimeUnit;

public class StopThread {
//	private static boolean stopRequested ;
//	public static void main(String[] args) throws InterruptedException {
//		Thread backgroundThread=new Thread(new Runnable() {
//			
//			@Override
//			public void run() {
//				int i=0;
//				while(!stopRequested){
//					i++;
//				}
//			}
//		});
//		
//		backgroundThread.start();
//		TimeUnit.SECONDS.sleep(1);//永远不会终止,没有同步,不能保证后台线程何时"看到"主线程对stopRequested值的修改
//		stopRequested=true;
//	}
	
	/****************synchronized**********************/
//	private static synchronized void  requestStop(){
//		stopRequested=true;
//	}
//	
//	private static synchronized boolean stopRequested(){
//		return stopRequested;
//	}
//	public static void main(String[] args) throws InterruptedException {
//		Thread backgroundThread=new Thread(new Runnable() {
//			
//			@Override
//			public void run() {
//				int i=0;
//				while(!stopRequested()){
//					i++;
//				}
//			}
//		});
//		
//		backgroundThread.start();
//		TimeUnit.SECONDS.sleep(1);//ok
//		requestStop();
//	}
	/********************volatile*******************/
	private static volatile boolean stopRequested ;//可以保证任何一个线程在读取改域的时候都将看到最近刚被写入的值
	public static void main(String[] args) throws InterruptedException {
		Thread backgroundThread=new Thread(new Runnable() {
			
			@Override
			public void run() {
				int i=0;
				while(!stopRequested){
					i++;
				}
			}
		});
		
		backgroundThread.start();
		TimeUnit.SECONDS.sleep(1);//ok
		stopRequested=true;
	}
}
总结:volatile关键字虽然比synchronized要好用,但是volatile要谨慎使用,因为可能会导致安全性失败。
最佳办法是不共享可变数据,要么共享不可变的数据,要么压根不共享。
《Effective Java 中文版》读书笔记 本书分为12章共90个条目,涵盖了Java 5.0/6.0/ 7.0/ 8.0/9.0的种种技术要点。与第2版相比,本书删除了“C语言结构的替代”一章,增加了Java 7及之后所引入的新特性: Lambda表达式、Stream、 Optional 类、接口中的默认方法、try-with-resources、@SafeVarargs注解、Module 模块化。数量上从78个条目发展到了90个,不仅增加了12个条目,并对原来的所有资料都进行了全面的修改,删去了一些已经过时的条目。但是,各章之间并没有严格的前后顺 阅读详情

相关推荐

ARM架构实战:在鲲鹏920服务器上用Debian12部署PVE虚拟化平台

本文详细介绍了在基于ARM架构的华为鲲鹏920服务器上,以Debian 12为底层系统,部署Proxmox VE(PVE)虚拟化平台的完整实战流程。文章重点解析了ARM64架构下PVE软件源的配置、内核安装的注意事项、部署后网络与存储的调优,并提供了针对ARM虚拟化环境的性能优化建议,为在国产化硬件上构建稳定高效的虚拟化环境提供了宝贵经验。

efc12345678的博客 780

《Effective Java》第10章 并发

本章给出一些建议帮忙程序员编写出清晰,正确,文档组织良好的并发程序。

AnnaLoad的专栏 633

告别臃肿VS!仅用Visual Studio 2022 Build Tools为Qt 5.12.12配置MSVC2017开发环境

本文详细介绍了如何仅使用Visual Studio 2022 Build Tools为Qt 5.12.12配置MSVC2017开发环境,避免安装臃肿的完整VS。通过精准选择组件、配置Qt Creator编译器和优化Kit设置,实现高效、精简的Windows平台Qt开发环境搭建,特别适合追求性能和资源优化的开发者。

weixin_30340617的博客 350

带你快速看完9.8分神作《Effective Java》—— 并发篇(工作里的这些坑你都遇到过吗?)

???? Java学习:Java从入门到精通总结 ???? Spring系列推荐:Spring源码解析 ???? 最近更新:2021年12月16日 ???? 个人简介:通信工程本硕????、阿里新晋猿同学????。我的故事充满机遇、挑战与翻盘,欢迎关注作者来共饮一杯鸡汤 ???? 点赞 ???? 收藏 ⭐留言 ???? 都是我最大的动力! 豆瓣评分9.8的图书《Effective Java》,是当今世界顶尖高手Josh Bloch的著作,在我之前的文章里我也提到过,编程就像练武,既需要外在的武功招

如切如磋,如琢如磨 1万+

SAP财务模块必看:BAPI_ACC_DOCUMENT_POST扩展字段全攻略(含FIBF配置)

本文详细解析了SAP财务模块中如何利用BAPI_ACC_DOCUMENT_POST的EXTENSION1参数扩展自定义字段。文章从需求分析入手,对比了传统增强与BTE(业务交易事件)两种技术路径,并重点提供了基于FIBF配置的完整实战指南,包括数据结构理解、函数模块开发及配置步骤,帮助ABAP开发者和财务顾问高效、可维护地实现如WBS元素、税务代码等字段的灵活传递。

weixin_29290963的博客 396

【回眸】Tessy集成测试软件使用指南(一)新手使用篇

这个专栏的文章前4篇都在记录如何使用Tessy进行单元测试,集成测试需要有一定单元测试基础,且做集成测试之前,需要做好单元测试,否则将会大幅增加软件单元代码纠错的代价。集成测试所花费的时间通常远远超过单元测试。如果直接从单元测试到系统测试,结果往往是不理想的。集成测试可以检测由于单元相互交互而导致的错误,通常由一组专业的测试人员执行。

啤酒鸭的物联网开发记录博客 5278

【Effective Java 读书笔记】第78条 同步访问共享的可变数据

书上的一个例子: public class StopThread { private static boolean stopRequested; public static void main(String[] args) throws InterruptedException{ Thread backgroundThread = new Thread(new Runnable(){ @Override

WYuan的博客 256

UniApp 覆盖安装后首次进入 APP pages.json 不生效的解决方案

通过以上步骤,解决了缓存问题导致的首次加载异常。此方案的关键在于强制更新文件名,从根本上避免旧缓存的干扰。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 681

Effective Java第二版第10章

10 并发 第66条:同步访问共享的可变数据 如果没有同步,一个线程的变化就不能被其他线程看到。同步不仅可以阻止一个线程看到对象处于不一致的状态之中,它还可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护的之前所有修改效果。 Java语言规范保证读写一个变量是原子的,除非这个变量为long或者是double。虽然语言规范保证了线程在读取原子数据的时候,不会看到任意的数值,但是它并不保证一个线程写入的值对于另一个线程将是可见的。 为了在线程之前进行可靠的通信,也为了互斥访问,同步是必要的。 p

kaikai_sk的博客 263

微波技术仿真:微波谐振器分析_(2).微波谐振器理论

谐振器是一种能够在特定频率范围内存储和释放电磁能量的器件。在微波频段,谐振器通常用于滤波、频率选择和能量存储等应用。一个理想的谐振器在谐振频率下能够存储无限大的能量,但在实际应用中,由于损耗的存在,谐振器的性能会受到一定限制。微波谐振器在微波通信、雷达系统、微波测量和微波电路设计等领域中发挥着重要作用。谐振器的设计需要考虑多个因素,包括谐振频率的精确控制、损耗的最小化、频率稳定性的提高和小型化设计。通过理论分析和仿真工具的使用,可以有效优化谐振器的性能,满足实际应用的需求。

2401_87715305的博客 933

【论文复现】——基于LM优化的NDT点云配准算法

传统的正态分布变换配准算法处理初始位姿变换相差较大的两帧点云时,存在无法收敛或者陷入局部最小值的问题。为了提高算法的收敛性能,提出了一种基于LM方法改进的三维正态分布变换配准算法。

点云侠的博客 1163

跟我学(Effective Java 2)第66条:同步访问共享的可变数据

第66条:同步访问共享的可变数据 关键字synchronized可以保证同一时刻,只有一个线程可以执行某个方法,或者摸一个代码块。许多人把同步的概念理解为一种互斥的方式,即,当一个对象被一个线程修改的时候,可以阻止另一个线程观察到对象内部不一致的状态。这种观点对象创建的时候处于一致的状态,当有方法访问它的时候,它就被锁定了。 这种观点是正确的,但是它并不是同步的全部意义。同步不仅可以阻止一个线程看...

Dullon_jiang的博客 304

Trustzone/TEE/安全 面试100问-目录

关键词:cache学习、mmu学习、cache资料、mmu资料、arm资料、armv8资料、armv9资料、 trustzone视频、tee视频、ATF视频、secureboot视频、安全启动视频、selinux视频,cache视频、mmu视频,armv8视频、armv9视频、FF-A视频、密码学视频、RME/CCA视频、学习资料下载、免费学习资料、免费 周贺贺,baron,代码改变世界ctw,Arm精选, 资深安全架构专家,十年手机安全/SOC底层安全开发经验。擅长trustzone/tee安全产品的设计

baron-周贺贺-代码改变世界ctw 649

《Effective Java》读书笔记十

同步访问共享的可变数据是确保多线程程序正确性和线程安全的关键。通过使用同步方法或同步块,可以防止数据不一致和竞争条件的发生。在实现同步时,要选择合适的同步对象,避免过度同步,并注意死锁风险和性能影响。同时,要保持代码的可维护性,以便在后续的开发和维护中能够正确地处理同步问题。

qq_41831136的博客 798

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

effective java同步访问共享的可变数据

关键字synchronized可以保证同一时刻,只有一个线程可以执行某一个方法,或者某一个代码块。 同步的意思: 1、当一个对象被一个线程修改的时候,可以阻止另一个线程观察到对象内部不一致的状态; 2、同步不仅可以组织一个线程看到对象处于不一致的状态,还可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护的之前所有的修改效果。 考虑下面这个阻止一个线程妨碍另一个线程的任务。ja

chai_ge_ge的博客 399

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

《Effective Java》阅读笔记66 同步访问共享的可变数据

《Effective Java》阅读笔记66 同步访问共享的可变数据 关键字synchronized可以保证在同一时刻只有一个线程可以执行某个方法或代码块。 Java规范保证对一个变量的读操作或者写操作是原子性(atomic,注意 i++是非原子性的,64位的long型或double型变量的读写操作也是非原子性的),但并不保证一个线程写入的值对另一个线程是可见的。 参考 避免使用Thread.stop()方法,而是采用轮询(poll)机制来终止一个线程。 如果只需要线程间的交互通信,而不需要

weixin_41563161的博客 220

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

effective java 读书笔记---第10章 并发

66.同步访问共享的可变数据

玩家六的专栏 378

《Effective Java》并发

第78条:同步访问共享的可变数据 参考学习:第六十六条 同步访问共享的可变数据 第79条:避免过度同步 参考学习:第六十七条 避免过度同步 第80条:executor、task和stream优先于线程 参考学习:第六十八条 executor和task优先于线程 第81条:并发工具优先于wait和notify 参考学习:第六十九条 并发工具优先于wait和notify 第82条:线程安全性的文档化 参考学习:第七十条 线程安全性的文档化 第83条:慎用延迟初始化 参考学习:第七十一条 慎用延迟初始化 第84条

朱嫑膘的博客 234

Effective Java解读

对书本每一章节解读、代码示例,更清晰的理解书本内容,明确说明优缺点

qq_48721706的博客 1027

Effective java 第十章 并发 同步访问共享的可变数据 读书笔记

并发 66.同步访问共享的可变数据 关键字synchronized可以保证在同一时刻,只有一个线程可以执行某一个方法,或者某一个代码块。 如果没有同步,一个线程的变化就不能被其他线程看到。同步不仅可以阻止一个线程看到对象处于不一致的状态之中,它还可以保证进入同步方法或者同步代码块的每个线程,都看到由一个锁保护的之前所有的修改效果。 java语言规范保证读写一个变量是原子的,除...

weixin_30785593的博客 139

Effective Java——并发

目录 六十六、同步访问共享的可变数据 六十七、避免过度同步 六十八、executor和task优先于线程 六十九、并发工具优先于wait和notify 七十、线程安全性的文档化 七十一、慎用延迟初始化 七十二、不要依赖于线程调度器 七十三、避免使用线程组 六十六、同步访问共享的可变数据         在Java中很多时候都是通过synchronized关键字来实现

痕泽的专栏 646

Effective Java学习(并发)之——同步访问共享可变数据

       关键字synchronized可以保证在同一时刻,只有一个线程可以执行某一个方法,或者某一个代码快。许多程序员把同步的概念仅仅理解为一种互斥的方式,即,当一个对象被一个线程修改的时候,可以阻止另一个线程观察到对象内部不一致的状态。按照这种观点,对象被创建的时候处于一致状态,当有方法访问他的时候,它就被锁定了。这些方法观察到对象的状态,并且可能会引起状态转变,即把对象从一种一致状态...

sungang1120的专栏 180

Effective Java读书笔记(第10章-并发)

第10章

lyl_tkb的专栏 475

Effective.Java第78-90条(同步相关)

78. 同步访问共享的可变数据   为了在线程之间进行可靠的通信,也为了互斥访问,同步是必要的。   不共享可变的数据。要么共享不可变的数据,要么压根不共享。换句话说,将可变数据限制在单线程中。   当多个线程共享可变数据的时候,每个读或写数据的线程必须执行同步。如果没有同步就无法保证一个线程所做的修改被另一个线程获知。如果只需要线程间的交互通信而不需要互斥,volatile是一...

weixin_30794851的博客 131

[读书笔记]《Effective Java》第10章并发

第66条:同步访问共享的可变数据 同步的意义。 正确地使用同步可以保证没有任何方法会看到对象处于不一致的状态中。 进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护的之前所有的修改效果。 Java语言规范保证读或者写一个变量是原子的,除非这个变量的类型为long或者double。 对于原子数据的读取,Java语言规范并不保证一个线程写入的值对于另一个线程将是可...

weixin_34061482的博客 174

Effective Java 读书笔记——66:同步访问共享的可变数据

关键字synchronized可以保证同一时刻,只有一个线程可以执行某个方法。 同步的概念 1、当一个对象被一个线程修改的时候,可以阻止另一个线程观察到对象内部不一致的状态; 2、同步不仅可以组织一个线程看到对象处于不一致的状态,还可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护的之前所有的修改效果。 另外,java语言规范保证读写一个变量是原子的,除非这个变量是doub

萌萌小七的专栏 949
上一篇: Jsoup第一关
下一篇: 自定义注解【一】
2YSP
博客等级 码龄10年 12粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值