`

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. *...

    基于Qt开发的截图工具- 支持全屏截图, 支持自定义截图,支持捕获窗口截图,支持固定大小窗口截图,颜色拾取,图片编辑

    基于Qt开发的截图工具.zip 截图工具(QScreenShot) Qt编写的一款截图工具。 特点 - 支持全屏截图 - 支持自定义截图 - 支持捕获窗口截图 - 支持固定大小窗口截图 - 颜色拾取 - 图片编辑 - 图片上传到wordpress 环境 Qt6.2 QtCreate 8

    毕业设计&课设_ 校园活动管理系统,优化校园活动组织流程,涵盖多方面功能模块的便捷平台.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    毕业设计基于ASP.NET技术的班级展示网站构建(源代码+论文).zip

    基于ASP.NET技术的班级展示网站构建资源,是一套针对教育机构或学生团体,旨在通过ASP.NET框架开发班级风采展示平台的指导资料或教程。此资源详细介绍了如何利用ASP.NET的强大功能,快速搭建一个功能完善、界面友好的在线班级展示平台。 该资源涵盖了从需求分析、数据库设计、前端页面制作到后端逻辑实现的全过程。通过实例演示,指导用户如何设置班级信息、学生风采展示、活动公告、图片上传与浏览等核心功能模块。同时,结合ASP.NET的MVC架构,实现了前后端分离,提高了代码的可维护性和可扩展性。 此外,该资源还提供了丰富的代码示例和注释,帮助开发者深入理解ASP.NET框架的工作原理,掌握如何运用其强大的数据库操作、用户认证与授权等特性。对于初学者来说,这是一份难得的入门教程;而对于有一定经验的开发者,则是一份提升技能的参考资料。 总之,基于ASP.NET技术的班级展示网站构建资源,是教育机构和学生团体实现班级风采在线展示的理想选择,也是开发者学习ASP.NET框架应用的宝贵资源。

    基于springboot的流浪动物管理系统源码数据库文档.zip

    基于springboot的流浪动物管理系统源码数据库文档.zip

    基于springboot+vue的实践性教学系统源码数据库文档.zip

    基于springboot+vue的实践性教学系统源码数据库文档.zip

    基于Python+Django家居全屋定制系统源码数据库文档.zip

    基于Python+Django家居全屋定制系统源码数据库文档.zip

    Umi-OCR-main.zip

    Umi-OCR-main.zip

    基于springboot复兴村医疗管理系统源码数据库文档.zip

    基于springboot复兴村医疗管理系统源码数据库文档.zip

    基于springboot二手物品交易系统源码数据库文档.zip

    基于springboot二手物品交易系统源码数据库文档.zip

    2024年西安外事学院数学建模校赛题目.zip

    2024年西安外事学院数学建模校赛题目.zip

    基于springboot医疗废物管理系统源码数据库文档.zip

    基于springboot医疗废物管理系统源码数据库文档.zip

    colormaps.ipynb

    GEE训练教程

    Spring Boot设计实战:从入门到精通的语言教程、实战案例与项目资源

    内容概要:本文详细介绍了Spring Boot的设计和应用,涵盖了从基本概念到高级用法的全方位教学。首先通过环境搭建、首个项目创建、核心概念解析等步骤帮助读者快速上手。接着阐述了Spring Boot的设计原则与最佳实践,强调代码整洁和系统可维护性。最后,提供了两个实战案例:构建简单的RESTful API和电商网站后台管理系统,涉及项目结构、依赖配置、数据库设计、实体类与控制器的创建等内容,指导读者进行真实项目的开发。 适合人群:适合初学者到中级开发者的Java开发人员,尤其是对企业级应用开发感兴趣的人士。 使用场景及目标:①帮助开发者全面掌握Spring Boot的基本用法及其设计理念;②提供实用的实战案例和资源,使读者能够在实际项目中熟练应用Spring Boot技术。 阅读建议:跟随文章提供的步骤逐步操作,并结合实际开发需求灵活运用所学知识。建议多动手练习,加强对Spring Boot的理解和掌握。

    毕业设计&课设_基于 SSM 的城市公交查询系统,含多种信息及数据库脚本.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    课程考试系统设计与开发:从理论到实践的全方位指南

    内容概要:本文详细介绍了一个课程考试系统的设计与开发过程,涵盖语言教程、实战案例和项目资源。主要内容包括:选择Java作为开发语言,详细讲解Java基础语法和Web开发基础;实战案例包括用户管理、课程管理和考试管理模块的实现;提供了项目结构、数据库设计和依赖管理的详细示例。 适合人群:适用于初学者和有一定经验的开发者,希望通过实际项目掌握课程考试系统的设计与开发。 使用场景及目标:帮助学习者全面提升从理论到实践的能力,最终能够独立完成一个完整的课程考试系统。无论是学习编程基础还是进阶实战,本文都提供了全面的指导。 其他说明:项目涉及多个关键技术和知识点,如Servlet、JSP、JDBC、MVC模式等,有助于深入理解和应用这些技术。此外,还包括项目部署和运行的具体步骤,方便学习者快速搭建和测试系统。

    《伯牙鼓琴》教学课件.pptx

    《伯牙鼓琴》教学课件.pptx

    基于springboot面向社区的智能化健康管理系统研究源码数据库文档.zip

    基于springboot面向社区的智能化健康管理系统研究源码数据库文档.zip

    基于springboot+javaweb宿舍管理系统源码数据库文档.zip

    基于springboot+javaweb宿舍管理系统源码数据库文档.zip

    基于SpringBoot的遥感影像共享系统源码数据库文档.zip

    基于SpringBoot的遥感影像共享系统源码数据库文档.zip

Global site tag (gtag.js) - Google Analytics