1.多线程的使用场景

其实简单归纳就是一点:想要提高响应速度就可以

举个很简单的业务,假使某个service里面涉及了4个mapper操作,且假使数据库部分耗时,每个mapper操作都约为1秒,普通的后台串行执行时间就是一个加法数学模型(1+1+1+1),这个时候若想提高效率最简单的方法就是同时执行这4个mapper操作,准确的描述是并发执行,这时若不考虑其他硬件性能,并发执行时间的数学模型大约为(1*N),这个N跟硬件性能、当前系统jvm之类的都有关,一般来说都是小于2的,这样一般情况下就能提高一倍的性能。

2.多线程常见的问题

1.主线程等待问题

主线程等待一个资源时不能一直等下去,需要设置一个最大值,要不会给用户一个很糟糕的体验,同时如果等待的人太多也会占有线程资源,影响性能。

举例:

Hystrix的服务降级,令牌桶、httpcliet的超时设置,阻塞队列的超时限制,java并发包的等待超时时间等待。。。一般来说都会设置一个最大值,防止这个队伍里的人一直无限延长。

2.数据共享问题

jmm相关,发生于多个线程共享一个变量且试图修改,造成一个线程修改另外线程无法读取到真实的值。

举例:

两个线程同时执行一段业务代码,传入一个boolean类型的变量,初始值为true,A线程发生异常,中断,将他们的boolean共享变量设置为false,B线程那边读到的永远都是ture。

最简单的办法就是使用final变量或Atomic变量,前者会禁止线程复制数据到自己内存里转为共享一个常量池,后者是原子类操作确保每次操作都会读取公告内存里的值。

3.子线程死锁问题

多线程环境下容易忽略一些细节导致某个线程一直执行或长时间占据线程资源,而系统内感知不到。

具体来说就是,假如调用一个业务接口的主线程超时了,主线程返回结果,主线程下面某个子线程没有被回收,而是继续执行,而一般场景下难以察觉到这个线程已经中断(所以有时候需要检测后台线程的功能),就会造成资源浪费,有的基于乐观锁机制的锁甚至还会发生死锁问题。

4.事务问题

子线程开启的事务不会合并到主线程事务里,并且和主线程所在的事务不是一个事务,每个线程都是一个独立的事务。

若有一个子线程发生了异常,只会他自己回滚。

实际中是,业务代码不能写到子线程的run内部,而是开启一个线程让其执行一个事务监控下的服务。

解决办法A:

需要设置一个共享值,所有线程执行业务时需要根据这个共享值判断是否有线程发生了异常,业务执行完后需要停下来等待其他线程执行完毕。

解决办法B:补偿机制,将发生异常的线程的数据保存起来发送给别的服务,在别的服务里进行补偿。

这两个办法有点像分布式事务里的内味了,强一致性和弱一致性。

5.子线程之间通信问题

和线程的数据共享有点像,这里主要说的是主线程如何控制多个不确定数量的子线程。

多线程等待多个线程执行完毕,同时多个线程之间也要等待主线程通知才能决定是否回滚。

涉及的有future队列,completeFutre,并发包等等。

举例A:

某个业务需要调取别的服务中4个不同的接口,这类情况下子线程之间没有关系。

举例B:

某个业务调用自己4个不通的接口,这4个接口都有事务相关性操作。这类情况下子线程之间有了关系,因为多线程下不确定谁先执行完,所以子线程之间需要等待彼此,主线程也要等待所有子线程执行完毕,java提供了计数器,屏蔽器等工具,可以确定一个值,子线程共享这个计数器,在finally里必定进行计数操作,然后被另外一个计数器屏蔽,主线程先被子线程计数器阻塞,被唤醒后再将主线程计数器减一,这样就达成了目的。

子线程:

主线程:

3.锁类型

大致分为没有锁的乐观锁和悲观锁,乐观锁简单来说是基于多个条件的循环,悲观锁有大量并发工具可以搭配使用。

若执行时间短,且竞争激烈可以采用乐观锁,若执行时间长,竞争不是太激烈可以用悲观锁。

不追求所谓的最优效率,其实两个锁都可以用,而且写法上使用悲观锁更易于阅读和控制。

java多线程使用心得相关推荐

  1. java修炼之多线程学习心得

    java修炼之多线程学习心得 java是少数几种支持"多线程"的开发语言之一.大多数的程序语言只能遵循运行单独的一个程序块,无法同时运行多个不同的程序块.java的"多线 ...

  2. Java多线程之线程间协作 notify与wait的使用

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 Java多线程操作运用很广,特别是在android程序方面.线程异步协作是多线程操作的难点也是关键,也 ...

  3. 多线程的实现方式_一文搞懂Java多线程使用方式、实现原理以及常见面试题

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  4. Java多线程编程核心技术-多线程基础使用

    导语   想要学习一个新的技术就必须要无限的接近它,深入的了解它,了解一个东西的步骤就是由浅入深的去深入的了解它.下面这个专题博主会带着大家共同学习Java多线程的核心编程技术,从入门到深入,也欢迎大 ...

  5. 你值得拥有!-阿里P8架构师荣耀典藏:Java多线程与Socket实战微服务框架笔记

    先赞再看,谢谢关注 小编分享的这份<Java多线程与Socket:实战微服务框架>,综合运用Java多线程.Socket.动态代理等技术来构建微服务框架 内容结构 本书从实战角度出发,首先 ...

  6. Java自学道路心得体会

    Java自学道路心得体会 成员与静态(static) 成员变量是写在类中,成员方法是public xxx类型 xxx方法(){},它俩需要创建对象才能调用. 静态变量是写在方法中,静态方法是publi ...

  7. 使用线程锁(lock)实现线程同步_一文搞懂Java多线程使用方式、实现原理以及常见面试题...

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  8. Java 多线程的基本方式

    Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

  9. Java EE学习心得

    –Java EE学习心得   1.    称为编程专家的秘诀是: 思考-----编程--------思考------编程--.. 编程不能一步到位,不能一上来就编,必须先思考如何写,怎样写?然后再编程 ...

  10. Java多线程读取本地照片为二进制流,并根据系统核数动态确定线程数

    Java多线程读取图片内容并返回 1. ExecutorService线程池 2. 效率截图 3. 源码 1. ExecutorService线程池 ExecutorService线程池,并可根据系统 ...

最新文章

  1. html长文本自动换行
  2. php扩展memcached和memcache的安装配置方法
  3. [当人工智能遇上安全] 7.基于机器学习的安全数据集总结
  4. vcsa清单配置和事件备份
  5. 数据包如何正确的发到目的地_江苏工业交换机厂家浅谈交换机如何应用
  6. BugkuCTF-MISC题蜜雪冰城~
  7. Linux中五种压缩命令
  8. PEP8——Python代码规范
  9. bat文件语法和技巧_这不是高手专利,一秒新建100个Excel文件
  10. 【TWVRP】基于matlab遗传算法求解多车场带时间窗的车辆路径规划问题【含Matlab源码 1035期】
  11. ffmpeg libx264_FFmpeg之FFmpeg模块介绍(一)
  12. 如何把照片转成pdf文件,支持合并转换
  13. Secondary Maps (Detail Maps) Detail Mask 二级贴图(细节贴图)细节遮罩 Standard Shader系列14
  14. oracle 如何实现excel的正态分布函数normdist
  15. 朗兰兹纲领:关于数学大一统的伟大构想
  16. snapchat_如何在Snapchat快照中添加背景
  17. 关于移动TD测试用户的800元月话费补贴的解释
  18. 【STM32 .Net MF开发板学习-12】跳动的音符(PWM合成)
  19. 元宇宙电商|“NFG”是什么,企业该如何利用元宇宙实现增值呢?
  20. VBS 请求WebAPI接口_如何设计WEB API

热门文章

  1. 计算机应用怎么写,计算机应用专业描述怎么写
  2. linux vnc服务器6,Linux(RHEL6\CENTOS6\OLE6) 下VNC-SERVER安装与配置
  3. take android,Protake
  4. a.使用new关键字产生对象会调用构造方法_七夕面向对象编程,你知道Java有哪些创建对象的方式吗?...
  5. 价值连城 ImageNet图像分类大神 Andrej Karpathy的采访 给AI 深度学习从业者的建议
  6. 378.有序矩阵中第K小的元素
  7. python中eval函数和str函数
  8. 凸优化有关的数值线性代数知识 1矩阵结构与算法复杂性
  9. 凸优化第五章对偶 5.2Lagrange对偶问题
  10. 凸优化第三章凸函数 3.6关于广义不等式的凸性