Java多线程总结
2015-07-31 16:30
435 查看
1.线程是什么,线程与进程的区别
1.1 线程的概念
一段程序执行流。1.2 线程中的一些术语
线程安全:多个线程访问同一个类,它始终表现正确的行为线程同步:线程的执行需要加锁
线程封闭:
内置锁/互斥锁:JVM提供的隐形锁,当使用synchronized修饰方法或者同步块时,进入时获取对象锁,出来时释放对象锁。
内存可见性:一个线程对状态的改变,其他线程都可以看见,例如:volatile修饰变量
原子性:在执行一个操作时,中间不会被其他线程抢占,例如:synchronized修饰方法
原子变量:AtomicLong,保证单个可变的状态的原子性。
CAS:compare and swap,硬件实现。
竞态条件:程序的执行结果与线程的交替执行顺序有关。
fast-fail:当有多个线程访问同一个容器,如果至少有一个对他修改,会抛出异常。例如:HashMap,ArrayLIst,Vector。
复合操作:一个操作包含几个细小的操作,例如:若队列为空,线程阻塞。
线程阻塞:线程在等待其他事件,例如:锁,IO结束。
1.3 线程与进程的区别
a.一个进程至少有一个主线程,也可以有多个线程;b.线程是CPU分配和调度的基本单元,进程是资源分配的基本单元;
c.创建线程的消耗比创建进程小;
d.线程之间共享同一个进程的资源,进程独享自己的资源;
2 .线程的创建
2.1 继承Thread类
class A extends Thread{}缺点:Java中类只能单继承,无法再继承其他类
2.2 实现Runnable接口
class A implements Runnable{}注意:必须实现run方法
2.3 实现Callable接口
class A implements Callabke{}注意:必须实现call方法
与Runnable的区别在于一个有返回值,可以抛异常;另一个没有返回值
3 线程安全
3.1 为什么会出现线程安全问题
多个线程同时访问一个类,至少有一个执行写操作,却没有加锁。3.2 怎么解决线程安全问题
3.2.1 不可变
String,不可变对象始终是线程安全的。
3.2.2 不共享
将对象封闭在线程中,不与其他线程共享。
3.2.3 加锁
将需要共享的可变状态封闭在对象中,所有对状态的操作设置在方法上,并且对方法的访问全部加锁。锁独占:内置锁/互斥锁
锁分段:ConcurrentHashMap
可中断锁:ReentrantLock
4 线程的调度
4.1 线程优先级
给每个线程一个标记,5 线程池
5.1 线程池概念以及组成
在程序启动时,就先创建好一些线程,等待请求到来,直接使用。
组成:核心线程池,任务队列
5.2 线程池原理
核心线程池是否满了,若未满,先创建线程;若满了,将来不及处理的任务放入任务队列,当队列满了之后,还可以创建线程,直到线程池满。
5.3 创建线程池
Executors工具类的一些方法,newCachedThreadPool(),newFixedThreadPool();
相关文章推荐
- MyEclipse逆向生成实体类和Hibernate映射文件
- jdk带的一些工具,强悍
- Eclipse安装testng失败,提示MD5值错误
- Java复习第四天
- java当中float以及double数据类型的掌握
- Java集合类详解
- cxf与spring的整合
- java中import机制(指定import和import *的区别)
- 成绩查询系统Java版-我们要做的还有很多
- java 获取当前系统时间 时间大小比较
- 跟我上“云”端(四)使用eclipselink构建企业级多租户应用
- JAVA学习路线图---(JAVA1234)
- 深入探讨 Java 类加载器
- Java Web项目导出excel表,地址栏中文正常,但是文件下载报404中文文件名乱码
- [Java]Java计算器
- 多线程与java运行环境的总结
- Java遍历输出指定目录、树形结构所有文件包括子目录下的文件
- spring和mybatis 整和(二)商品信息的修改
- java中的引用数据类型
- java.text.Format体系总结