Java多线程 多线程是什么意思

内容导航:

  • Java多线程
  • 什么是多线程

一、Java多线程1 基本概括
Java多线程 多线程是什么意思

文章插图
2 主要介绍2.1 线程安全的概念
当多个线程访问一个对象时 , 如果不用考虑这些线程在运行时环境下的调度和交替执行 , 也不需要进行额外的同步 , 或者在调用方进行任何其他的协调操作 , 调用这个对象的行为都可以获得正确的结果 , 那这个对象就是线程安全的 。
2.2 多线程编程的三个概念
2.2.1 原子性
这一点 , 跟数据库事务的原子性概念差不多 , 即一个操作(有可能包含有多个子操作)要么全部执行(生效) , 要么全部都不执行(都不生效) 。
2.2.2 可见性
这一点 , 跟数据库事务的原子性概念差不多 , 即一个操作(有可能包含有多个子操作)要么全部执行(生效) , 要么全部都不执行(都不生效) 。
2.2.3 有序性
顺序性指的是 , 程序执行的顺序按照代码的先后顺序执行 。
以下面这段代码为例
boolean started = false; // 语句1
long counter = 0L; // 语句2
counter = 1; // 语句3
started = true; // 语句4
从代码顺序上看 , 上面四条语句应该依次执行 , 但实际上JVM真正在执行这段代码时 , 并不保证它们一定完全按照此顺序执行 。
处理器为了提高程序整体的执行效率 , 可能会对代码进行优化 , 其中的一项优化方式就是调整代码顺序 , 按照更高效的顺序执行代码 。
2.3 解决机制
1、加锁:
a、锁能使其保护的代码以串行的形式来访问 , 当给一个复合操作加锁后 , 能使其成为原子操作 。一种错误的思想是只要对写数据的方法加锁 , 其实这是错的 , 对数据进行操作的所有方法都需加锁 , 不管是读还是写
b、加锁时需要考虑性能问题 , 不能总是一味地给整个方法加锁synchronized就了事了 , 应该将方法中不影响共享状态且执行时间比较长的代码分离出去
c、加锁的含义不仅仅局限于互斥 , 还包括可见性 。为了确保所有线程都能看见最新值 , 读操作和写操作必须使用同样的锁对象
2、不共享状态:
无状态对象: 无状态对象一定是线程安全的 , 因为不会影响到其他线程
线程关闭: 仅在单线程环境下使用
3、不可变对象:
可以使用final修饰的对象保证线程安全 , 由于final修饰的引用型变量(除String外)不可变是指引用不可变 , 但其指向的对象是可变的 , 所以此类必须安全发布 , 也即不能对外提供可以修改final对象的接口
2.4 线程安全的级别
线程安全的级别或者粒度有三种 , 如下:
(1)线程安全
这种情况下其实没有线程安全问题 , 比如上面的例子中 , 每个人都有自己专用的卫生间 , 所以不会存在竞争问题 。
(2)条件安全
条件安全 , 顾名思义是有条件的 , 所有人共用几个卫生间 , 抢到资源的就把门关上 , 通过门来隔离资源 , 后面的人就在外面等待直到里面的人出来 。
(3)不安全
这种情况下连门都没有 , 所以并不能很好保证资源安全 , 所以这种情况***不能让同时让多个人直接使用 。
2.5 并发的概念
并发 指单个cpu同时处理多个线程任务 , cpu在反复切换任务线程 , 实际还是串行化的;
并行 指多个cpu同时处理多个线程任务 , cpu可以同时处理不同的任务 , 异步处理;
并发条件
第一 , 是否有共享变量 第二 , 是否多线程环境 第三 , 是否多个线程更新共享变量 一句话:多个线程操作同一个对象;
2.5 并发的优势和风险
Java多线程 多线程是什么意思

文章插图
2.6 避免并发
2.6.1 线程封闭
什么是线程封闭?
就是把对象封装到一个线程里 , 只有这一个线程能看到此对象 。那么这个对象就算不是线程安全的也不会出现任何安全问题 。
实现线程封闭有哪些方法?
ad-hoc 线程封闭
这是完全靠实现者控制的线程封闭 , 他的线程封闭完全靠实现者实现 。