Java并发编程
一、多线程创建的方法
1.正确创建线程的方式
a.继承Thread类
b.实现Runnable的接口
2.Thread和Runnable的对比
a.Runnbale方式实现已经对Thread创建对象解耦,而用继承Thread方法没有实现对象的解耦
b.如果使用Thread方式创建对象,每次创建一个新的任务,只能新建一个独立的线程,这样操作对CPU消耗较大,而采用Runnable或者线程池就可以大大减少消耗
c.Java不支持双继承,而Runnable可以多重实现接口,从而实现代码的可扩展性
3.创建线程方式有四种
a.继承Thread类
b.实现Runnable接口(无返回参数线程)
c.实现Callable接口(有返回参数线程)
d.创建线程池
e.定时器
4.前沿技术的网站 : https://ohmyrss.com/ https://www.infoq.cn
二、启动线程正确方式
1.一次线程调用两次start之后会有什么问题?
它会抛出一个线程错误状态的异常,线程自身会做检查
三、中断线程的方法 interrupt和interrupted区别
1.优先选择----> 中断传递 : 优先选择在方法上抛出异常(签名中抛出异常),这样可以传递到顶层,这样防止底层吞掉或者漏掉(底层使用try/catch的方法把代码漏掉或者吞掉)
2.不想或者无法传递中断-------> 恢复中断
在方法中恢复中断,调用Thread.currentThread().interrupt()来回复中断到顶层
3.Java异常体系
4.错误演示中断代码,使用volate boolean来处理中断
volate boolean 无法处理长时间阻塞的状态
当线程处于长时间阻塞状态下,就没有办法及时唤醒线程
四、线程的生命周期
1.生命周期包括
New : 已经创建但是还没有启动,调用start方法之前
Runnable : 线程已经启动,已经调用start方法
Blocked : 已经进行synchorized 修饰之后,进入阻塞状态
Waiting
Timed Waiting
Terminated
五、Thread和Object方法详解
1.阻塞阶段、唤醒阶段、遇到中断三个执行过程
阻塞阶段 : wait的方法
唤醒阶段:
五、多线程性能
六、Java内存模型、Java数据结构、Java对象模型
1.Java内存模型:原子性、可见性、重排序
2.重排序:
3.死锁产生的条件
a.必须在多个线程条件下
b.自己持有一个锁并且还持有其他锁
c.构成一个环路
4.如何避免死锁的产生
a.多使用并发类,尽量不要自己设计
b.能使用同步代码块尽量不要使用同步方法
c.避免锁的嵌套
d.尽量根据不同业务使用不同的锁
5.生产者消费者模型
class ConsumerProducer{
LinkedList list = new LinkedList();
public synchronized void put(){
while (list.size() == 10){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
list.add(new Date());
notify();
}
public synchronized void take(){
while (list.size() == 0){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
list.poll();
notify();
}
}
一、Java内存同步8种操作
1.lock : 作用于主内存的变量,把一个变量标识为一条线程独占的状态
2.unlock : 作用于主内存的变量,把一个处于锁定的状态的变量释放出来,释放后的变量才可以被其他的线程的访问
3.read : 作用于主内存的变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作的使用
4.load : 作用于工作内存的变量,它把read操作从主内存中得到的变量值放入到工作内存的变量的副本中
5.use : 作用于工作内存的变量,把工作内存中的一个变量传递给执行引擎
6.assign : 作用于工作内存的变量,它把一个从执行引擎接收到的赋值给工作内存的变量
7.store : 作用于工作内存的变量,把工作内存中的一个变量的值传递到主内存中,以便所有write的操作
8.write : 作用于主内存的变量,它把store操作从工作内存中一个变量的值传递到主内存的变量中
二、线程的安全性的讲解
1.线程安全性包括的内容
a. 原子性 : 提供互斥访问,同一时刻只能有一个线程来对它进行操作 synchronized
b. 可见性 : 一个线程对主内存的修改可以及时的被其他线程观察到 volatile(不具有原子性,禁止指令重排序)
c. 有序性 : 一个线程观察其他线程中的指令执行顺序,由于指令重排序的存在,该观察结果一般杂乱无序
posted on 2019-09-01 21:05 zhang11111wei 阅读(182) 评论(0) 编辑 收藏 举报