为什么需要并发,多线程?
-
时代的召唤,为了更充分的利用多核CPU的计算能力,多个线程程序可通过提高处理器的资源利用率来提升程序性能。
-
方便业务拆分,异步处理业务,提高应用性能。
多线程并发产生的问题?
-
大量的线程让CPU频繁上下文切换带来的系统开销。
-
临界资源线程安全问题(共享,可变)。
-
容易造成死锁。
注意:当多个线程执行一个方法时,该方法内部的局部变量并不是临界资源,因为这些局部变量是在每个线程的私有栈中,因此不具有共享性质,不会导致线程安全问题。
可见性
多线程访问同一个变量时,如果有一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。这是因为为了保证多个CPU之间的高速缓存是一致的,操作系统会有一个缓存一致性协议,volatile就是通过OS的缓存一致性协议策略来保证了共享变量在多个线程之间的可见性。
public class ThreadDemo2 {
private static boolean flag = false;
public void thread_1(){
flag = true;
System.out.println(“线程1已对flag做出改变”);
}
public void thread_2(){
while (!flag){
}
System.out.println(“线程2->flag已被修改,成功打断循环”);
}
public static void main(String[] args) {
ThreadDemo2 threadDemo2 = new ThreadDemo2();
Thread thread2 = new Thread(()->{
threadDemo2.thread_2();
});
Thread thread1= new Thread(()->{
threadDemo2.thread_1();
});
thread2.start();
try {
Thre