当前位置: 首页 > news >正文

java获取其他线程的错误_java多线程开发容易犯的错误

昨天在社区上看到有人讨论多线程使用,多线程遇到一些问题以及一些使用技巧记录一下。为什么要使用多线程,

不能是为了用而用,和设计模式一样用的合理,会让程序更易于理解,用的不合理反而会让程序变得更难理解。

过去使用场景有,cms内容管理系统多个编辑配置频道,将多个频道以及频道下文章发布成静态html,如果单线程

我们一般是这么去做的,首先通过sql取得全部频道,对频道进行遍历,取到每个频道在取频道下文章列表,然后遍历

文章列表的每一片文章,对每一篇文章标题、作者、简介、内容、图片取出根据配置模版生成html文件,文章列表执

行完一个取下一个频道循环执行。直到所有频道发布完毕,这是整个站点发布完毕,发布过程结束。

上述方式很好完成了发布这个需求,但是作为研发的我们有没有更好、更快方式去搞定这件事情呢?一定有的,

只要我们去想。如果我们将每个频道发布看成一个任务,通过多线程方式并行同时去发布频道那发布时间10个频道

理论上会成为原来10分之一,整个发布减少了时间、提升了性能,用户能够更快看到新内容、新文章。

用多线程要对线程、线程池、同步机制不断学习,因为多线程是好东西,但坑也是很多。稍有不慎就会导致程序bug、

甚至死锁、线上cpu100%服务不可用。

public class MyVisiblility{

private static boolean ready;

private static int number;

private static class MyReaderThread extends Thread{

public void run(){ //读线程

while(!ready)

Thread.yield();

System.out.println(number);

}

public static void main(String [] args){ //主线程

new MyReaderThread().start();

number=42;

ready=true;

}}

这段程序有很大几率输出结果可能为0,也可能是死循环,跟我们期待不一样,原因是什么呢?线程对共享变量

的所有操作都必须在自己的工作内存中进行,不能直接从主线程中获取。因为副本主线程修改子线程为能收到。当

number变量不可见时输出结果为0,当ready不可见时子线程死循环。解决问题方式将变量加上volatile修饰词解决

多线程变量可见性问题。

即程序改为:

public class MyVisiblility{

private static volatile boolean ready;

private static volatile int number;

private static class MyReaderThread extends Thread{

public void run(){ //读线程

while(!ready)

Thread.yield();

System.out.println(number);

}

public static void main(String [] args){ //主线程

new MyReaderThread().start();

number=42;

ready=true;

}}

个性化推荐系统(八)--- 机器学习深度学习召回集扩量这篇文章通过CountDownLatch实现主线程等待

多个计算线程同步,要将CountDownLatch.down()方法用在finally方法中,不要再其他地方,昨天review发现

线上再一个返回逻辑中用了CountDownLatch.down(),再finally中也用了,而finally中时一定会执行的,这时

相当于执行了两次主线程有几率不等待剩余线程向下执行,导致程序偶发bug,这个其实是对finally理解不到位。

再有就是经典HashMap用于多线程而没有用ConcurrentHashMap导致线上服务cpu100%详见这篇记一次双11大促压测线上服务cpu100%。

再有就是ThreadLocal变量在ThreadPoolExecuter线程同时使用时,程序异常相见警惕ThreadLocal和ThreadPoolExecutor同时使用。

多线程使用好会提升程序性能简化程序实现,使用不好会引入bug、cpu100%、死循环、程序偶发不正确,并且

还不容易定位。这就要求我们要不断研究学习多线程技术,以保证优雅正确将多线程应用到线上服务以及其他各种场景。

相关文章:

  • java 检索数据_java代码实现搜索elasticsearch索引数据
  • java非异步线程池_Spring Boot利用@Async异步调用:ThreadPoolTaskScheduler线程池的优雅关闭详解...
  • mongo java driver 3.2_MongoDB-JAVA-Driver 3.2版本常用代碼全整理(2) - 查詢
  • java中标记怎么用_在Java中使用标记(标签)
  • java结束sql链接_数据查询时报出java.sql.SQLException: 关闭的连接
  • java 控制台画表格_Java库在控制台上构建和打印表格?
  • 242. valid anagram java_Leetcode242 Valid Anagram JAVA语言
  • java 查找大写字母_Java实现给定一个包含大写字母和小写字母的字符串,找到通过这些...
  • java 绘图球的移动_在Java上绘制2个朝不同方向移动的球,但一个消失了
  • php中购物车结算代码,jquery购物车结算功能实现方法
  • php.ini配置 耗时,配置PHP.INI监测服务器的脚本耗时
  • java自动生成测试与评估,jmeter如何自动生成测试报告
  • php memcached存储对象,从memcached获取对象并在PHP中设置为self
  • java阅读安卓,java – 如何在android中逐行阅读?
  • plotm matlab,MATLAB画地图的工具:worldmap和m_map
  • python3.6+scrapy+mysql 爬虫实战
  • Angular4 模板式表单用法以及验证
  • ES6语法详解(一)
  • Github访问慢解决办法
  • Java新版本的开发已正式进入轨道,版本号18.3
  • Java知识点总结(JavaIO-打印流)
  • JDK9: 集成 Jshell 和 Maven 项目.
  • quasar-framework cnodejs社区
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • webpack入门学习手记(二)
  • 搞机器学习要哪些技能
  • 使用 Docker 部署 Spring Boot项目
  • 想写好前端,先练好内功
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • MPAndroidChart 教程:Y轴 YAxis
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​【已解决】npm install​卡主不动的情况
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (十六)Flask之蓝图
  • (四) Graphivz 颜色选择
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • .gitattributes 文件
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • @基于大模型的旅游路线推荐方案
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [BZOJ3757] 苹果树
  • [codevs 2822] 爱在心中 【tarjan 算法】
  • [docker] Docker容器服务更新与发现之consul
  • [EULAR文摘] 利用蛋白组学技术开发一项蛋白评分用于预测TNFi疗效
  • [Firefly-Linux] RK3568修改控制台DEBUG为普通串口UART
  • [git] windows系统安装git教程和配置
  • [HTML]Web前端开发技术28(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页
  • [ICCV2017]Neural Person Search Machines
  • [iOS]-NSTimer与循环引用的理解