> 文档中心 > JAVA SE(第n天)( 多线程)

JAVA SE(第n天)( 多线程)

今天学的赶紧记录,之前没赶的进度之后搞。。


目录

多线程

1.cpu基础知识

2.多线程效率问题与底层原理

3.多线程创建方式

4.线程安全性问题

5.synchronized基本用法

6.如何保证线程同步问题


多线程

1.cpu基础知识

cpu:中央处理器→1.运算器   作用运算 2.控制器   负责发出cpu每条指令所需信息 3.寄存器   保存运算或指令的一些临时文件进程:1.cpu从硬盘中读取一段程序到内存中,该执行程序的实例叫进程。     2.一个程序如果被cpu多次读取到内存中,则变成多个独立进程。线程:线程是程序执行的最小单位,在进程中可以有多个不同的线程同时执行。(同一个过程中,更好并行处理)线程运行在cpu之上总结:进程是资源分配最小单位,线程是程序执行最小单位。     

2.多线程效率问题与底层原理

1.为什么使用多线程?    采用多线程形式执行代码,目的就是为了提高程序效率。2.串行/并行区别?    串行 单线程执行,代码效率低代码从上到下。    并行 多线程并行一起执行,效率高。3.使用多线程一定效率高?    不一定,cpu调度的算法,先把前一个任务的cpu上下文(也就是cpu寄存器和程序计数器:从汇编语言底层   角度,不是java源代码角度,Java源代码一句可能汇编会有四句)保存起来,然后加载新任务的上下文到这些   寄存器和程序计数器,最后在跳转到程序计数器所指的新位置,运行新任务。4.什么是上下文?    所谓多线程,在线程数远大于cpu内核数是,所有线程被cpu调度时间片所调度,在短时间内多次在运行状   态和就绪状态之间切换。(如果生产环境中开启几百个或几千个线程,而我们服务器内核数一般8、16、32 ,   这么多线程都会在cpu上做上下文切换,导致效率低下)5.一般会设置线程池:8内核的cpu可以限定最多八个线程,减少cpu做上下文切换。6.多线程同步/异步的区别?    同步:代码从上到下运行    异步:单独分支运行,相互之间没有影响

3.多线程创建方式

①继承Thread new Thread(thread01).start();②实现Runnable类  Thread abc = new Thread(new Runnable() {     @Override     public void run() {  System.out.println("abc");     } }); abc.start();③使用匿名内部类  new Thread(new Runnable() {     @Override     public void run() {  System.out.println("abc");     } }).start();④使用lamda表达式     new Thread(() -> System.out.println("abc")).start();⑤使用callable和Future创建   //先创建一个ThreadCallable类     ThreadCallable threadCallable = new ThreadCallable();     FutureTask integerFutureTask = new FutureTask(threadCallable);     Thread thread = new Thread(integerFutureTask);     thread.start();⑥使用线程池例如Executor ExecutorService executorService = Executor.newCachedThreadpod();    executorService.execute(() -> System.out.println("") );⑦spring @Async    

4.线程安全性问题

1.线程安全问题定义    当多个线程共享一个全局变量(放在堆内存中),在做写操作时,可能会受到其他线程干扰,发生线程安全性      问题。2.如何解决线程安全性问题?/如何实现线程同步?    在同一JVM中,多个线程需要竞争锁资源,最终只有一个线程能够获取锁,多个线程同时抢同一把锁,谁能获取到锁,谁就可以被执行,如果一直没有获取锁成功,中间就要经历锁的升级,如果一直没有获得到锁,该线程就一直会阻塞等待。(核心思想:同JVM中当多个线程共享同一个全局变量时,将可能会发生线程安全性的代码上锁,保证只有拿到锁的线程才可以执行,没有拿到锁的线程不可以执行,需要阻止。)3.JUC并发编程:重入锁、悲观锁、乐观锁、公平锁、非公平锁(synchronized锁)4.代码加锁的缺点:可能会影响到程序的执行效率。

5.synchronized基本用法

1.修饰代码块 synchronized(对象锁){ 需要保证线程安全的代码。    }2.修饰实例方法(this锁)3.修饰静态方法(类名.class锁)tips:1.多线程情况下,需要的是同一个对象锁。     2.注意synchronized锁的死锁问题,锁嵌套会引发死锁问题。

6.如何保证线程同步问题

如何保证线程同步问题(如何1保证线程安全性问题)?(具体操作)    1.使用synchronized锁,jdk1.6锁的升级过程(偏量锁→轻量级锁→重量级锁)    2.使用Lock锁,需要自己完成锁的升级过程,底层基于AQS+CAS实现。    3.使用ThreadLocal,需要注意内存泄漏问题    4.原子类CAS 非阻塞式