`

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

    pandas-1.3.5-cp37-cp37m-macosx_10_9_x86_64.zip

    pandas whl安装包,对应各个python版本和系统(具体看资源名字),找准自己对应的下载即可! 下载后解压出来是已.whl为后缀的安装包,进入终端,直接pip install pandas-xxx.whl即可,非常方便。 再也不用担心pip联网下载网络超时,各种安装不成功的问题。

    基于java的大学生兼职信息系统答辩PPT.pptx

    基于java的大学生兼职信息系统答辩PPT.pptx

    基于java的乐校园二手书交易管理系统答辩PPT.pptx

    基于java的乐校园二手书交易管理系统答辩PPT.pptx

    tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl

    tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl

    Android Studio Ladybug(android-studio-2024.2.1.10-mac.zip.002)

    Android Studio Ladybug 2024.2.1(android-studio-2024.2.1.10-mac.dmg)适用于macOS Intel系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/89954174 part2: https://download.csdn.net/download/weixin_43800734/89954175

    基于ssm框架+mysql+jsp实现的监考安排与查询系统

    有学生和教师两种角色 登录和注册模块 考场信息模块 考试信息模块 点我收藏 功能 监考安排模块 考场类型模块 系统公告模块 个人中心模块: 1、修改个人信息,可以上传图片 2、我的收藏列表 账号管理模块 服务模块 eclipse或者idea 均可以运行 jdk1.8 apache-maven-3.6 mysql5.7及以上 tomcat 8.0及以上版本

    tornado-6.1b2-cp38-cp38-macosx_10_9_x86_64.whl

    tornado-6.1b2-cp38-cp38-macosx_10_9_x86_64.whl

    Android Studio Ladybug(android-studio-2024.2.1.10-mac.zip.001)

    Android Studio Ladybug 2024.2.1(android-studio-2024.2.1.10-mac.dmg)适用于macOS Intel系统,文件使用360压缩软件分割成两个压缩包,必须一起下载使用: part1: https://download.csdn.net/download/weixin_43800734/89954174 part2: https://download.csdn.net/download/weixin_43800734/89954175

    基于MATLAB车牌识别代码实现代码【含界面GUI】.zip

    matlab

    基于java的毕业生就业信息管理系统答辩PPT.pptx

    基于java的毕业生就业信息管理系统答辩PPT.pptx

    基于Web的毕业设计选题系统的设计与实现(springboot+vue+mysql+说明文档).zip

    随着高等教育的普及和毕业设计的日益重要,为了方便教师、学生和管理员进行毕业设计的选题和管理,我们开发了这款基于Web的毕业设计选题系统。 该系统主要包括教师管理、院系管理、学生管理等多个模块。在教师管理模块中,管理员可以新增、删除教师信息,并查看教师的详细资料,方便进行教师资源的分配和管理。院系管理模块则允许管理员对各个院系的信息进行管理和维护,确保信息的准确性和完整性。 学生管理模块是系统的核心之一,它提供了学生选题、任务书管理、开题报告管理、开题成绩管理等功能。学生可以在此模块中进行毕业设计的选题,并上传任务书和开题报告,管理员和教师则可以对学生的报告进行审阅和评分。 此外,系统还具备课题分类管理和课题信息管理功能,方便对毕业设计课题进行分类和归档,提高管理效率。在线留言功能则为学生、教师和管理员提供了一个交流互动的平台,可以就毕业设计相关问题进行讨论和解答。 整个系统设计简洁明了,操作便捷,大大提高了毕业设计的选题和管理效率,为高等教育的发展做出了积极贡献。

    机器学习(预测模型):2000年至2015年期间193个国家的预期寿命和相关健康因素的数据

    这个数据集来自世界卫生组织(WHO),包含了2000年至2015年期间193个国家的预期寿命和相关健康因素的数据。它提供了一个全面的视角,用于分析影响全球人口预期寿命的多种因素。数据集涵盖了从婴儿死亡率、GDP、BMI到免疫接种覆盖率等多个维度,为研究者提供了丰富的信息来探索和预测预期寿命。 该数据集的特点在于其跨国家的比较性,使得研究者能够识别出不同国家之间预期寿命的差异,并分析这些差异背后的原因。数据集包含22个特征列和2938行数据,涉及的变量被分为几个大类:免疫相关因素、死亡因素、经济因素和社会因素。这些数据不仅有助于了解全球健康趋势,还可以辅助制定公共卫生政策和社会福利计划。 数据集的处理包括对缺失值的处理、数据类型转换以及去重等步骤,以确保数据的准确性和可靠性。研究者可以使用这个数据集来探索如教育、健康习惯、生活方式等因素如何影响人们的寿命,以及不同国家的经济发展水平如何与预期寿命相关联。此外,数据集还可以用于预测模型的构建,通过回归分析等统计方法来预测预期寿命。 总的来说,这个数据集是研究全球健康和预期寿命变化的宝贵资源,它不仅提供了历史数据,还为未来的研究和政策制

    基于微信小程序的高校毕业论文管理系统小程序答辩PPT.pptx

    基于微信小程序的高校毕业论文管理系统小程序答辩PPT.pptx

    基于java的超市 Pos 收银管理系统答辩PPT.pptx

    基于java的超市 Pos 收银管理系统答辩PPT.pptx

    基于java的网上报名系统答辩PPT.pptx

    基于java的网上报名系统答辩PPT.pptx

    基于java的网上书城答辩PPT.pptx

    基于java的网上书城答辩PPT.pptx

    婚恋网站 SSM毕业设计 附带论文.zip

    婚恋网站 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B

    基于java的戒烟网站答辩PPT.pptx

    基于java的戒烟网站答辩PPT.pptx

    基于微信小程序的“健康早知道”微信小程序答辩PPT.pptx

    基于微信小程序的“健康早知道”微信小程序答辩PPT.pptx

Global site tag (gtag.js) - Google Analytics