Java 线程高级
1.volatile关键字:当多个线程操作共享数据时,可以保证内存中的数据可见,相较于syncronized是一种较为轻量级的同步策略,
注意:1.volatile不具有“互斥性”
2.volatile不能保证变量的"原子性"
2.i++的原子性问题:i++的操作实际上分为三个步骤”读-改-写“
int i = 10;
i = i++;//10
int temp = i;
i = i+1;
temp = i;
3.解决原子性的方式:原子变量:jdk1.5后,java.util.concurrent.atomic 包下提供了常用的原子性变量,变量的特点如下
1.volatile保证内存可见性
2.CAS(compare and swap)算法保证数据的原子性
CAS算法是硬件对于并发操作共享数据的支持
CAS包含3个操作数:
内存值V
预估值A
更新值B
当且仅当V == A 时,V = B,否则,将不做任何操作
ConcurrentHashMap采用”锁分段“级别
CountDownLatch:闭锁操作
实现Callable的方式相比于实现Runnable接口的方式区别:可以存在返回值,可以抛出异常,执行Callable的方式,需要FutureTask<>实现类的支持,用于接收运算结果,FutureTask是Future接口的实现类
解决多线程安全的三种方式
1.synchronized同步代码块
2.synchronized同步方法
3.Lock 同步锁,显示锁:需要通过lock()进行上锁,必须进行unlock()解锁,更加灵活,使用Lock等待,lock.newCondition();
生产者-消费者模式种,使用wait()和notify()实现等待唤醒机制,使用这个机制的原因是,如果不进行等待,则消费者或生产者在条件不满足的情况下,还是会去频繁进行条件判断
为了避免虚假唤醒问题(多个生产者和消费者,造成数据错乱的现象),应该把wait()始终使用在循环中,wait()方法会使当前线程进入阻塞状态,并且释放锁对象,sleep()方法并不会释放当前锁,若是不存在互斥的方法,则sleep的时候执行其他方法
ReadWriteLock 读写锁
原则:
写写/读写 需要”互斥“ 写数据的同时再写,可能造成数据错误,写数据的时候同时读,可能读到不完整的数据,所以都需要互斥
读读 不需要”互斥“ 并发的读取数据,并不需要互斥,不会造成差错
所以:读取数据的时候,可以允许有多个读锁,但是写数据的时候,只能有一个写锁,这种方式的效率,相对于独占锁来讲,至少并发读取数据方面,是有较大提升的
线程池:提供了一个线程队列,队列种保存着所有等待状态的线程。避免了创建与销毁的额外开销,提升响应速度。
线程池的体系结构:
java.util.concurrent.Executor:负责线程的使用与调度的根接口
|--ExecutorService:子接口,线程池的主要接口
|--ThreadPoolExecutor:实现类
|--ScheduledExecutorService:子接口,负责线程的调度
|--ScheduledThreadPoolExecutor:继承ThreadPoolExecutor和实现ScheduledExecutorService
工具类:Executors
ExecutorService: newFixedThreadPool():创建固定大小的线程池
ExecutorService:newCachedThreadPool():缓存线程池,线程池中的线程数量不固定,可以根据需求自动更改数量
ExecutorService:newSingledThreadPool():创建一个只有一个线程的线程池
ScheduledExecutorService:newScheduledThreadPool():创建固定大小的线程池,还可以定时或延时执行任务
Java 线程高级的更多相关文章
- Java线程的概念
1. 计算机系统 使用高速缓存来作为内存与处理器之间的缓冲,将运算需要用到的数据复制到缓存中,让计算能快速进行:当运算结束后再从缓存同步回内存之中,这样处理器就无需等待缓慢的内存读写了. 缓 ...
- 细说进程五种状态的生老病死——双胞胎兄弟Java线程
java线程的五种状态其实要真正高清,只需要明白计算机操作系统中进程的知识,原理都是相同的. 系统根据PCB结构中的状态值控制进程. 单CPU系统中,任一时刻处于执行状态的进程只有一个. 进程的五种状 ...
- Java线程的5个使用技巧
萝卜白菜各有所爱.像小编我就喜欢Java.学无止境,这也是我喜欢它的一个原因.日常工作中你所用到的工具,通常都有些你从来没有了解过的东西,比方说某个方法或者是一些有趣的用法.比如说线程.没错,就是线程 ...
- java线程的理解
java thread类都是native方法实现的,所以没有用平台无关的方法实现,怎么实现的呢? 线程的实现: 第一种:使用内核线程实现. 内核线程就是直接使用操作系统内核支持的线程,由内核完成切换. ...
- Java线程与Linux内核线程的映射关系[转]
Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程. Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是 ...
- Java线程池的原理及几类线程池的介绍
刚刚研究了一下线程池,如果有不足之处,请大家不吝赐教,大家共同学习.共同交流. 在什么情况下使用线程池? 单个任务处理的时间比较短 将需处理的任务的数量大 使用线程池的好处: 减少在创建和销毁线程上所 ...
- Java线程池与java.util.concurrent
Java(Android)线程池 介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行 ...
- Java线程(二):线程同步synchronized和volatile
上篇通过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么会产生这样的结果呢,因为建立的Count对象是线程 ...
- 程序员的视角:java 线程(转)
在我们开始谈线程之前,不得不提下进程.无论进程还是线程都是很抽象的概念,有一个关于进程和线程很形象的比喻能帮我们更好的理解. 进程就像个房子,房子是一个包含了特定属性的容器,例如空间大小.卧室数量等. ...
随机推荐
- 运筹学学报-运行问题之新版TeX系统支持修改
<运筹学学报>的LaTeX模板基本上是CCT的典型而且是停留在LaTeX2.09 的时代,故而很多用户下载其模板无法在新TeX系统里使用,这里提供以下解决方案.源文件中的前几行:\docu ...
- MyEclipse设置不编译js部分
https://jingyan.baidu.com/album/ca41422fe094251eae99ede7.html?picindex=1 步骤: 1)选中当前工程,右键单击properties ...
- css 页面滚动 多背景固定不动
经常看到一些网站,滚动页面但是背景图不会跟着滚动,好像一直固定在浏览器窗口,感觉挺酷的,哇哦 ~ ~ 原来都是 background-attachment 这位大兄弟的功劳 background-at ...
- TOYS(计算几何-入门)
题目 ‘^’代表叉乘 ‘•’代表点乘 点积:a•b=ax*bx+ay*by 叉积:a^b=ax*by-bx*ay
- rancher版本问题引发的节点注册失败失败
rancher版本问题引发的节点注册失败失败 待办 https://www.cnblogs.com/Me1onRind/p/11147639.html
- html中实现数据的显示和隐藏
Author: YangQingQing <!DOCTYPE html><html><meta http-equiv="Content-Type" c ...
- koa2第一天 安装koa2
安装全局koa2:npm install -g koa2 -generator 创建一个koa2文件夹:koa2 -e koa2 进入koa2文件夹:cd koa2 安装npm模块:npm insta ...
- 事务:Transaction详解
1.事务概念: 一组sql语句操作单元,组内所有SQL语句完成一个业务,如果整组成功:意味着全部SQL都实现:如果其中任何一个失败,意味着整个操作都失败.失败,意味着整个过程都是没有意义的.应该是数据 ...
- robots.txt 让搜索引擎不再收录网站
有没有担心过自己的隐私会在强大的搜索引擎面前无所遁形?想象一下,如果要向世界上所有的人公开你的私人日记,你能接受吗?的确是很矛盾的问题,站长们大都忧虑“如何让搜索引擎收录的我的网站?”,而我们还是要研 ...
- Vue-移动端开发全家桶
内容:node.js,vue-cli,vuex,axios,postcss-pxtorem,lib-flexible,vant ,babel-plugin-import 1.安装脚手架工具: npm ...