Java Thread应该注意的问题

RenderThread线程报错记录 RenderThread线程报错是很蛋疼的,它是属于native报错,而且还会有各种情况。 04-23 16:31:38.343 17895 17895 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** 04-23 16:31:38.344 17895 17895 F DEBUG : Build fingerprint: 'xiaomi/tiffany/tiffany:7.1.2/N2G47H/V9.5 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> Java的线程编程非常简单。但有时会看到一些关于线程的错误用法。下面列出一些应该注意的问题。 1.同步对象的恒定性 All java objects are references. 对于局部变量和参数来说,java里面的int, float, double, boolean等基本数据类型,都在栈上。这些基本类型是无法同步的;java里面的对象(根对象是Object),全都在堆里,指向对象的reference在栈上。 java中的同步对象,实际上是对于reference所指的“对象地址”进行同步。 需要注意的问题是,千万不要对同步对象重新赋值。举个例子。 class A implements Runnable{ Object lock = new Object(); void run(){ for(...){ synchronized(lock){ // do something ... lock = new Object(); } } } run函数里面的这段同步代码实际上是毫无意义的。因为每一次lock都给重新分配了新的对象的reference,每个线程都在新的reference同步。 大家可能觉得奇怪,怎么会举这么一个例子。因为我见过这样的代码,同步对象在其它的函数里被重新赋了新值。 这种问题很难查出来。 所以,一般应该把同步对象声明为final. final Object lock = new Object(); 使用Singleton Pattern 设计模式来获取同步对象,也是一种很好的选择。 2.如何放置共享数据 实现线程,有两种方法,一种是继承Thread类,一种是实现Runnable接口。 上面举的例子,采用实现Runnable接口的方法。本文推荐这种方法。 首先,把需要共享的数据放在一个实现Runnable接口的类里面,然后,把这个类的实例传给多个Thread的构造方法。这样,新创建的多个Thread,都共同拥有一个Runnable实例,共享同一份数据。 如果采用继承Thread类的方法,就只好使用static静态成员了。如果共享的数据比较多,就需要大量的static静态成员,令程序数据结构混乱,难以扩展。这种情况应该尽量避免。 编写一段多线程代码,处理一个稍微复杂点的问题。两种方法的优劣,一试便知。 3.同步的粒度 线程同步的粒度越小越好,即,线程同步的代码块越小越好。尽量避免用synchronized修饰符来声明方法。尽量使用synchronized(anObject)的方式,如果不想引入新的同步对象,使用synchronized(this)的方式。而且,synchronized代码块越小越好。 4.线程之间的通知 这里使用“通知”这个词,而不用“通信”这个词,是为了避免词义的扩大化。 线程之间的通知,通过Object对象的wait()和notify() 或notifyAll() 方法实现。 下面用一个例子,来说明其工作原理: 假设有两个线程,A和B。共同拥有一个同步对象,lock。 1.首先,线程A通过synchronized(lock) 获得lock同步对象,然后调用lock.wait()函数,放弃lock同步对象,线程A停止运行,进入等待队列。 2.线程B通过synchronized(lock) 获得线程A放弃的lock同步对象,做完一定的处理,然后调用 lock.notify() 或者lock.notifyAll() 通知等待队列里面的线程A。 3.线程A从等待队列里面出来,进入ready队列,等待调度。 4.线程B继续处理,出了synchronized(lock)块之后,放弃lock同步对象。 5.线程A获得lock同步对象,继续运行。 例子代码如下: public class SharedResource implements Runnable{ Object lock = new Object(); public void run(){ // 获取当前线程的名称。 String threadName = Thread.currentThread().getName(); if( “A”.equals(threadName)){ synchronized(lock){ //线程A通过synchronized(lock) 获得lock同步对象 try{ System.out.println(“ A gives up lock.”); lock.wait(); // 调用lock.wait()函数,放弃lock同步对象, // 线程A停止运行,进入等待队列。 }catch(InterruptedException e){ } // 线程A重新获得lock同步对象之后,继续运行。 System.out.println(“ A got lock again and continue to run.”); } // end of synchronized(lock) } if( “B”.equals(threadName)){ synchronized(lock){//线程B通过synchronized(lock) 获得线程A放弃的lock同步对象 System.out.println(“B got lock.”); lock.notify(); //通知等待队列里面的线程A,进入ready队列,等待调度。 //线程B继续处理,出了synchronized(lock)块之后,放弃lock同步对象。 System.out.println(“B gives up lock.”); } // end of synchronized(lock) boolean hasLock = Thread.holdsLock(lock); // 检查B是否拥有lock同步对象。 System.out.println(“B has lock ? -- ” hasLock); // false. } } } public class TestMain{ public static void main(){ Runnable resource = new SharedResource(); Thread A = new Thread(resource,”A”); A.start(); // 强迫主线程停止运行,以便线程A开始运行。   try { Thread.sleep(500); }catch(InterruptedException e){ } Thread B = new Thread(resource,”B”); B.start(); } } 5.跨类的同步对象 对于简单的问题,可以把访问共享资源的同步代码都放在一个类里面。 但是对于复杂的问题,我们需要把问题分为几个部分来处理,需要几个不同的类来处理问题。这时,就需要在不同的类中,共享同步对象。比如,在生产者和消费者之间共享同步对象,在读者和写者之间共享同步对象。 如何在不同的类中,共享同步对象。有几种方法实现, (1)前面讲过的方法,使用static静态成员,(或者使用Singleton Pattern.) (2)用参数传递的方法,把同步对象传递给不同的类。 (3)利用字符串常量的“原子性”。 对于第三种方法,这里做一下解释。一般来说,程序代码中的字符串常量经过编译之后,都具有唯一性,即,内存中不会存在两份相同的字符串常量。 (通常情况下,C ,C语言程序编译之后,也具有同样的特性。) 比如,我们有如下代码。 String A = “atom”; String B = “atom”; 我们有理由认为,A和B指向同一个字符串常量。即,A==B。 注意,声明字符串变量的代码,不符合上面的规则。 String C= new String(“atom”); String D = new String(“atom”); 这里的C和D的声明是字符串变量的声明,所以,C != D。 有了上述的认识,我们就可以使用字符串常量作为同步对象。 比如我们在不同的类中,使用synchronized(“myLock”), “myLock”.wait(),“myLock”.notify(), 这样的代码,就能够实现不同类之间的线程同步。 本文并不强烈推荐这种用法,只是说明,有这样一种方法存在。 本文推荐第二种方法,(2)用参数传递的方法,把同步对象传递给不同的类。
FreeModbus从入门到实战:手把手教你用STM32实现工业级Modbus RTU通信 本文详细介绍了如何使用STM32和FreeModbus实现工业级Modbus RTU通信,涵盖硬件搭建、协议栈移植及优化技巧。重点解析了FreeModbus的移植过程,包括串口驱动适配、定时器配置和工业级稳定性优化,为开发者提供了一套完整的工业通信解决方案。 阅读详情

相关推荐

无人机上下通信信号解析程序和代码

总的来说,无人机上下行信号解析是无人机系统中非常重要的一部分,它关系到无人机的飞行控制和图像传输能力,对于保障无人机的飞行安全和数据传输质量具有重要作用。3. 读取和解析地面控制中心发送的命令和数据:程序还需要能够读取地面控制中心发送给无人机的命令和数据。1. 读取和解析无人机发送的命令和数据:程序需要能够读取无人机发送的信号,并解析其中的命令和数据。4. 将解析结果传递给无人机:解析地面控制中心发送的命令和数据后,程序需要将解析结果传递给无人机。具体的实现方式可以根据无人机的通信协议和硬件设备来确定。

2401_84824274的博客 2189

关于使用Android开发Vitamio框架Android6.0会Crash

缘由前段时间领导让我研究了一个公司的老项目,很简单,就是控制监控设备,进行远程查看监控的项目,我拿到手的时候,这个项目简直不能直视,完全无架构可言,没办法,再乱也要上啊,因为要更改上面的一个功能,项目本身有一个百度地图,将其更换为蜂鸟室内地图(其实我完全没有听说过),哈哈,用了一天时间算是集成好了,OK,交工!问题就在我高兴的喊着结束的时候,问题来了,项目无法播放视频,我调试了好几个小时,也是只要播

事情往往烟消云散 5021

保姆级教程:不用看古早代码,5分钟搞懂泛微ecology9附件存储与接口调用

本文详细解析了泛微ecology9附件存储与接口调用的核心原理,提供从基础概念到实战操作的完整指南。通过拆解文档化附件设计理念、解析RESTful接口参数,并给出Python代码示例,帮助开发者快速掌握附件上传与业务集成的关键技巧,提升二次开发效率。

weixin_28688385的博客 350

Java MultiThread学习笔记

1. synchronized function 用法:  synchronized foo() {} 字面意思是让一个函数块保持同步,但是保持和谁同步呢? 答案是和另一个或一些加了synchronized 关键字的函数,它能保证在这个对象内,所有加synchronized 的函数在同一时间只有一个在运行,并只运行在某一个线程中,假如这些函数可能会被运行在不同的线程,又要同时访问同一个

herbert的知识库 4287

影像组学文章复现:ITHscore:通过多尺度放射学特征全面定量NSCLC肿瘤内异质性 ----小细胞肺癌肿瘤异质性评分

目的:通过计算机断层扫描(CT)图像量化非小细胞肺癌(NSCLC)的肿瘤内异质性(ITH)。 方法:整合局部辐射特征和全局像素分布模式,开发定量ITH测量-ITHscore。在六个患者队列(n = 1399)中检查ITHscore与肿瘤表型,基因型和患者预后的关联,以验证其在表征ITH方面的有效性。

xxx 1020

RV1126笔记二十七:MetaRTC6移植

MetaRTC6移植

6038

Java序列化类在写出到本地时由于存在Thread对象而报错的原因分析的解决方法

本文简单分析了Java序列化类在写出到本地时由于存在Thread对象而报错的原因,并提供了两种简单的方法来避免这一问题,第一个方法具有较大的局限性,除非线程会自动结束且不会对程序后续运行造成重大影响,否则不推荐使用。第二个方法在第一个方法的基础上进行了简单改进,使其可以继续拥有对线程的控制权。不过这两个方法都只是本人在练习时遇到问题简单做的处理方法,仅代表本人想法,不是解决这类问题的根本方法。

qq_41710502的博客 801

CVPR 2023 中的半监督学习: FixMatch 的升级版 UniMatch

我们首先回顾下发表在 NeurIPS 2020 上的 FixMatch: Simplifying Semi-Supervised Learning with Consistency and Confidence,FixMatch 是一种更轻量的半监督分类方法。如下图所示,FixMatch 首先使用模型(带标签数据训练后的)对弱增强的未标记图像进行预测,生成伪标签。对于给定的图像,只有在模型产生高置信度的预测时,伪标签才会被保留。然后,在输入同一图像的强增强版本时,训练模型预测伪标签。

NJU phd 在读。 2633

Java Thread 应该注意的一些问题

1.同步对象的恒定性 All java objects are references.对于局部变量和参数来说,java里面的int, float, double, boolean等基本数据类型,都在栈上。这些基本类型是无法同步的,java里面的对象(根对象是Object),全都在堆里,指向对象的reference在栈上。java中的同步对象,实际上是对于reference所指的“对象地址”

PCDisport的专栏 572

29. 如何通过 ABAP 代码给 SAP OData 元数据增添注解

我们先看下效果,在 MPC_EXT 类的 DEFINE 方法里编写 ABAP 代码之后,用 Postman 使用 url 访问 OData metadata,在返回的数据里,能看到我们用 ABAP 代码添加的自定义注解。你好,请问可以不可以在odata里面通过什么设置,从而自动给metadata.xml中加上注解,实现value help的功能,还是说每次需要在metadata.xml中修改?的词汇引用,然后为命名空间 com.sap.vocabularies.UI.v1 声明了一个别名。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1660

手把手教你学AI GPU的UMD驱动软件开发专栏简介

通过本专栏的学习,您将掌握UMD的核心概念、开发环境搭建、API实现、内存管理和同步技术,以及在实际AI场景中的应用。通过本专栏的学习,您将不仅掌握UMD驱动开发的核心技术,还将能够将这些技术应用到实际的AI应用场景中,为您的AI应用提供更高效的硬件加速支持。无论您是想开发自己的AI加速框架,还是希望深入理解现有AI加速库的工作原理,本专栏都将为您提供宝贵的知识和实践经验。:本专栏不仅讲解UMD驱动的核心概念,还通过精心设计的实战案例,引导您从零开始构建UMD驱动,真正掌握AI GPU驱动开发的技能。

MHD0815的博客 113

Java Thread应该注意的问题 (转)

Java Thread应该注意的问题 (转)[@more@]Java Thread应该注意的问题 (wang hailong) XML:namespace prefix = o ns = "urn:schemas-micro...

csd3176的博客 66

ShowDoc item_id 未授权SQL注入漏洞复现

2024年6月,ShowDoc官方发布新版本修复了一个SQL注入漏洞。鉴于该漏洞无前置条件,易于利用,且默认情况下可暴破用户token获取系统后台权限,建议所有使用该系统的企业尽快升级修复,以确保系统安全。

0xSec 2357

java holdslock_Java Thread应该注意的问题 (转)

Java Thread应该注意的问题 (转)[@more@]Java Thread应该注意的问题(wang hailong)XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />Java的线程编程非常简单。但有时会看到一些关于线程的错误用法。下面列出一些应该注意的问题。1.同步对象的恒定性All j...

weixin_29048775的博客 85

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

(转)JAVA基础:Java Thread应该注意的问题

最近几天看了看多线程,收集了几篇文章。   出处:http://www.1to2.us/Java-Object-a159815.htm   Java的线程编程非常简单。但有时会看到一些关于线程的错误用法。下面列出一些应该注意的问题。 1.同步对象的恒定性 All java objects are references. 对于局部变量和参数来说,java里面的int, float, doub...

安塞俩穆阿拉昆~~ 91

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Java中的多线程编程可以通过线程类Thread和线程接口Runnable实现。

执行程序时,调用Thread类的start()方法会启动一个新线程,并在新线程中执行run()方法。- 线程间通信:多个线程之间需要进行通信来协调工作,可以使用wait()、notify()、notifyAll()等方法实现。- 线程优先级:JVM通过线程调度器来控制程序中多个线程的执行顺序,可以使用setPriority()方法设置线程的优先级。多线程编程的目的是提高程序的并发性和效率,但是也需要谨慎处理线程同步和线程间通信等问题,以免导致线程安全问题和程序性能下降。

编程菜鸟的博客 261

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: Pet Store 应用程序设计和实现.doc
下一篇: Sun CEO麦克尼利:我给你选择的自由
java169
博客等级 码龄18年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值