并发介绍
线程的优点: 1.提供资源的利用率 2.提高程序性能
线程的风险: 1. 死锁 2. 上下文切换 3. 线程安全
多线程的实现方式
-
Thread类
-
Runnable接口
-
Callable
-
future
当多个线程同一时间运行同一段代码,线程会竞争,成员变量就会产生问题。那么如何解决这类问题呢?
- 给方法加 synchronized(同步锁),建议给关键代码加 synchronized 代码块 这样效率会比加在方法上效率快。
synchronized是个内部锁:对象内部给我们提供的锁,每个对象都会有个状态变量,每个线程去访问时,都要去判断它的状态变量。同时它也是个可重入锁,意思是:当一个线程去获取它已经持有的锁,它是能够成功的。锁是线程间互斥的,但是同一个线程是不会互斥的。synchronized能够解决可见性,原子性。 - Atomic原子性 当给成员变量加了原子性后,也相当于给成员变量加上了锁。但这个实现跟 synchronized 不一样,因为原子性并不会排队执行。
线程可见性、线程封闭
指令重排序:编译器和处理器为了提高程序的运行性能,对指令进行重新排序。但是如果某条指令是依据前面的指令而执行的,那么这条指令肯定是在最后执行的。
重排序分三种类型:
-
编译器优化的重排序
编译器在不改变单线程程序语义的前提下(代码中不包含synchronized关键字),可以重新安排