`

Practicle Java笔记 实践46-58(同步&线程部分)

阅读更多

 

实践46

同步机制锁定的是对象,而不是函数或代码。当synchronized被当作函数修饰符时,它所取得的lock被交给函数的调用者。如果synchronized用于object reference,则取得的lock交给该reference所指的对象。(因此同一类2个不同对象之间加this锁是无效的,因为不是同一个锁)

Java不允许将构造函数声明为synchronized。当两个线程并发调用一个构造函数的时候,它们各自操控的是同一个class的两个不同实体的内存。但如果构造函数内部包含竞争共享资源的代码,则必须同步控制以回避冲突。

实践47

当调用一个synchronized static函数时,获得的lock将与[定义该函数]之class的Class对象相关联,而不是与调用函数的那个对象相关联。当对一个class literal调用其synchronized 区段时,获得的也是同样那个lock,也就是[与特定Class 对象相关联]的lock

看一段代码:

 

	class Foo implements Runnable{
		public synchronized void printM1(){
			while(true)
				System.out.println("M1");
		}
		public synchronized static void printM2(){
			while(true)
				System.out.println("M2");
		}
		public void run(){
			printM1();
		}
	}
	
	class Test{
		public static void main(String args[]){
			Foo f=new Foo();
			Thread t=new Thread(f);
			t.start();
			f.printM2;
		}
	}

这段代码最终较差打印了M1和M2 而没有实现同步

原因在于:一个同步的是static函数,而一个是instance函数,printM1取得的是Foo object lock,而printM2取得的则是Foo的Class object lock。

要使上述代码同步可以:1 同步控制公共资源 2 同步控制一个特殊的instance变量

用byte[] lock=new byte[0];是最经济的

实践48

对于[在synchronized函数中可被修改的数据],应使之成为private,并根据需要提供访问函数。如果访问函数返回的是可变对象(mutable object),那么应该先cloned(克隆)该对象。

实践49

一般情况下请不要同步化所有函数,同步化不仅造成程序缓慢,并且丧失了并发可能

  采用“单对象多锁”技术以允许更多并发动作。

实践50

不可分割的操作并不意味着多线程安全。只要多个线程共享某些变量,它们就必须被访问于synchronized函数或区段内,或是被声明为volatile。这样可以确保变量与主内存完全保持一致,从而在任何时刻都得到正确数值。

采用synchronized或是volatile取决于多个因素。如果并发性很红药,且不需要更新很多变量,可以使用volatile,如果要更新许多变量,volatile执行速度会比同步低。如果使用synchronized,只有在取得和释放lock的时候,变量和主内存才进行一致化

两者关系:

synchronized

优点:取得和释放lock时进行私有专用副本和主内存正本的一致化

缺点:清除了并发性的可能

volatile

优点:允许并发性

缺点:每次访问变量就会进行私有专用内存对应主内存的一致化

实践51

同步化某一函数,并不一定就会使其成为“多线程安全”,如果synchronized函数操控着多个函数,而它们并不都是此函数所属class的private instance data,那么你必须对这些对象自身也进行同步化。

对关键词synchronized必须记住,它锁定的是对象而非函数或代码。

实践52

以固定而全局性的顺序取得多个locks(机锁)以避免死锁

实践53

优先使用notifyAll()而非notify()

notify()只唤醒一个线程 而你无法控制唤醒哪一个线程 只有在2个前提下 用notify才是安全的:

1 只有一个线程在等待

2 多个线程正等待同一条件成立,且哪个被唤醒都无所谓

线程式的优先权(priority)不能确保线程一定被notify()唤醒,也不能确定各线程被notifyAll()以何种顺序唤醒。

实践54

针对wait()和notifyAll()使用旋锁(spin locks)

由于被唤醒的线程会从之前调用wait()的地点开始继续向下执行,英雌在等待条件变量时,请总是使用旋锁确保正确结果。如下:

 

	if(condition==true){
		try{
			a.wait()
		}catch(){}
	}

改成

 

	while(condition==true){
		try{
			a.wait()
		}catch(){}
	}

从而保证唤醒后条件仍然成立没有被改变

实践55

使用wait(),notifyAll()代替轮询

实践56

当一个对象被锁定,有可能其他线程会因同一个object lock而受阻(blocked),假如你对上锁对象的object reference重新赋值,其他线程内悬而未决的那些locks将不再有意义。

所以,不要对上锁对象的object reference重新赋值

实践57

不要调用stop()和suspend()方法

实践58

通过线程间协作来终止线程

 

	private volatile boolean stop;
	public void stopThread(){
		stop=true;
	}
	public void run(){
		while(!stop){}
		//do Clean Works...
	}

很可惜这里必须用到轮询 并且注意stop变量被声明为volatile以确保值永远是最新的

 

分享到:
评论

相关推荐

    java实训.java实训.zip

    6. **多线程**:线程的创建、同步与通信,如synchronized关键字、wait()、notify()方法和并发工具类。 7. **设计模式**:常见的设计模式如单例、工厂、观察者、装饰器、代理等,以及它们在实际开发中的应用。 8. *...

    PLC与WinCC实现三部十层电梯协同控制及优化技巧

    内容概要:本文详细介绍了参与西门子杯比赛中关于三部十层电梯系统的博图V15.1程序设计及其WinCC画面展示的内容。文中不仅展示了电梯系统的基本架构,如抢单逻辑、方向决策、状态机管理等核心算法(采用SCL语言编写),还分享了许多实际调试过程中遇到的问题及解决方案,例如未初始化变量导致的异常行为、状态机遗漏空闲状态、WinCC画面动态显示的挑战以及通信配置中的ASCII码解析错误等问题。此外,作者还特别提到一些创意性的设计,如电梯同时到达同一层时楼层显示器变为闪烁爱心的效果,以及节能模式下电梯自动停靠中间楼层的功能。 适合人群:对PLC编程、工业自动化控制、电梯调度算法感兴趣的工程技术人员,尤其是准备参加类似竞赛的学生和技术爱好者。 使用场景及目标:适用于希望深入了解PLC编程实践、掌握电梯群控系统的设计思路和技术要点的人士。通过学习本文可以更好地理解如何利用PLC进行复杂的机电一体化项目的开发,提高解决实际问题的能力。 其他说明:文章风格幽默诙谐,将严肃的技术话题融入轻松的生活化比喻之中,使得原本枯燥的专业知识变得生动有趣。同时,文中提供的经验教训对于从事相关领域的工作者来说非常宝贵,能够帮助他们少走弯路并激发更多创新思维。

    数据库第一章选择题练习(1).docx

    数据库第一章选择题练习(1).docx

    spring-ai-pdf-document-reader-1.0.0-M7.jar中文文档.zip

    # 【spring-ai-pdf-document-reader-1.0.0-M7.jar中文文档.zip】 中包含: 中文文档:【spring-ai-pdf-document-reader-1.0.0-M7-javadoc-API文档-中文(简体)版.zip】 jar包下载地址:【spring-ai-pdf-document-reader-1.0.0-M7.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【spring-ai-pdf-document-reader-1.0.0-M7.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【spring-ai-pdf-document-reader-1.0.0-M7.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【spring-ai-pdf-document-reader-1.0.0-M7-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: spring-ai-pdf-document-reader-1.0.0-M7.jar中文文档.zip,java,spring-ai-pdf-document-reader-1.0.0-M7.jar,org.springframework.ai,spring-ai-pdf-document-reader,1.0.0-M7,org.springframework.ai.reader.pdf,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,springframework,spring,ai,pdf,document,reader,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【spri

    深度学习答辩PPT案例展示

    适用于理工专业的毕业生,毕业答辩时可供参考,叙述详细准确,可以作为自己答辩PPT的参考

    weixin248食堂订餐小程序ssm(文档+源码)_kaic

    weixin248食堂订餐小程序ssm(文档+源码)_kaic

    spring-ai-weaviate-store-1.0.0-M6.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    【RF-SSA-LSTM】随机森林-麻雀优化算法优化时间序列预测研究附Python代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    【图像分割和识别】活动形状模型 (ASM) 和活动外观模型 (AAM)附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    基于主从博弈的电热综合能源系统动态定价与能量管理MATLAB仿真

    内容概要:本文详细介绍了如何利用主从博弈(Stackelberg Game)模型进行电热综合能源系统的动态定价与能量管理。首先解释了主从博弈的基本概念及其在电热综合能源系统中的应用背景,即供电公司作为领导者通过制定电价策略影响用户行为,用户作为追随者根据电价调整用电模式。接着,通过MATLAB编写仿真程序,具体展示了供电公司定价策略、用户响应模型以及主从博弈迭代过程。仿真结果显示,电价与用电需求之间存在动态平衡关系,供电公司可通过调整电价引导用户合理用电,实现系统整体最优运行。此外,文中还讨论了热力系统建模、成本计算方法、博弈迭代收敛条件等关键技术细节,并对未来的研究方向进行了展望。 适合人群:从事能源管理系统设计、优化及相关领域的研究人员和技术人员,特别是对博弈论在能源系统中的应用感兴趣的学者。 使用场景及目标:适用于希望深入了解电热综合能源系统中动态定价与能量管理机制的人群。主要目标是通过理论分析和MATLAB仿真,帮助读者掌握主从博弈模型的应用方法,为实际工程设计提供参考。 其他说明:文中提供了详细的MATLAB代码示例,便于读者理解和复现实验结果。同时强调了在实际应用中需要考虑更多不确定性和个性化需求等问题。

    Android SO逆向-基本数据类型及函数的工作原理.pdf

    Android逆向过程学习

    2级C全国计算机考试上机题库汇总.doc

    2级C全国计算机考试上机题库汇总.doc

    房地产 -龙湖物业品质提升小方法.doc

    房地产 -龙湖物业品质提升小方法.doc

    基于S7-200 PLC与MCGS组态的煤矿排水系统自动化控制方案解析

    内容概要:本文详细介绍了基于S7-200 PLC和MCGS组态软件构建的煤矿排水系统控制方案。主要内容涵盖IO分配、梯形图程序设计、接线图原理、MCGS组态画面配置等方面。通过对水位传感器、故障传感器等输入设备和排水泵、报警装置等输出设备的精确控制,确保了排水系统的高效、可靠运行。文中还分享了一些实际项目中的调试经验和故障排除技巧,如硬件配置优化、信号干扰处理、水位监测精度提升等。 适合人群:从事工业自动化领域的工程师和技术人员,特别是对PLC编程和组态软件有一定了解的人群。 使用场景及目标:适用于煤矿及其他矿业企业的排水系统自动化改造项目,旨在提高排水系统的安全性、稳定性和智能化水平,减少人工干预,预防潜在风险。 其他说明:文章不仅提供了理论指导,还包括大量实战经验分享,有助于读者更好地理解和掌握相关技术和应用场景。

    【蓝桥杯EDA】客观题解析:第十三届省赛模拟题一.pdf

    【蓝桥杯EDA】客观题解析

    从移动激光雷达点云中提取电源线附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    【数学建模竞赛】华中杯数学建模竞赛介绍:参赛指南与备赛建议

    内容概要:“华中杯”是由华中地区高校或相关机构举办的数学建模竞赛,旨在培养学生的创新能力和团队合作精神。比赛主要面向全国高校在校生(以本科生为主,部分赛事允许研究生参加),采用团队赛形式(3人一组),参赛队伍需在72小时内完成建模、编程及论文写作。竞赛一般在每年4月或5月举行,设有多个奖项,具体比例根据参赛队伍数量确定。; 适合人群:对数学建模感兴趣并希望提升自身能力的全国高校在校生(本科生为主,部分赛事允许研究生参加)。; 使用场景及目标:①帮助学生了解数学建模竞赛的形式与流程;②为参赛者提供备赛建议,如学习往届真题、掌握Matlab、Python、LaTeX等工具以及明确团队分工;③鼓励学生关注官方通知,确保获取最新赛程和规则信息。; 其他说明:2025年的具体赛程、规则可能会有所调整,请以“华中杯数学建模竞赛官网”或主办方通知为准。可通过学校数学系或相关社团获取报名信息。

    光强温湿度计stm32.7z

    光强温湿度计stm32.7z

    基于TMS320F2812的永磁同步电机(PMSM)矢量控制与双闭环系统的实现

    内容概要:本文详细介绍了基于TMS320F2812 DSP控制器的永磁同步电机(PMSM)矢量控制系统的设计与实现。主要内容涵盖电流环和转速环的双闭环控制,包括ADC采样配置、坐标变换(Clarke和Park变换)、PI调节器的实现以及SVPWM生成等关键技术环节。文中特别强调了各个部分的具体代码实现及其调试技巧,如电流采样的三相两线法、PI调节器的积分限幅处理、SVPWM的扇区判断与作用时间计算等。此外,还讨论了一些常见的调试陷阱和解决方案,如QEP解码配置错误、死区时间设置不当等问题。 适合人群:具有一定嵌入式系统和电机控制基础知识的研发人员和技术爱好者。 使用场景及目标:适用于需要深入了解和掌握基于DSP2812的PMSM矢量控制系统的开发者。主要目标是帮助读者理解并实现高效的电流环和转速环双闭环控制系统,确保电机稳定运行并达到预期性能指标。 其他说明:文章不仅提供了详细的代码片段,还分享了许多实用的经验和教训,有助于读者在实际项目中少走弯路。同时,对于一些复杂的技术细节进行了深入浅出的解释,使得初学者也能逐步理解和应用这些高级控制算法。

Global site tag (gtag.js) - Google Analytics