多线程详解
1、线程与进程区别
每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。
总结:进程就是正在运行的程序,是所有线程的集合,每一个线程是进程中的一条执行路径。
2、多线程
多线程就是为了提高程序的执行效率。
3、守护线程
使用setDaemon(true)方法设置为守护线程
守护线程与主线程有关,主线程销毁守护线程也同时销毁。
用户线程指用户自定义创建的线程,也称为非守护线程。非守护线程与主线程无关联,主线程停止非守护线程也不会停止。
4、多线程几种状态
新建 就绪 运行 阻塞 停止
5、join
在线程B中调用线程A的join()方法,意思是:B线程等待A线程执行完毕后,B线程在执行。
6、线程安全
当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。
线程安全解决办法::使用多线程之间同步synchronized或使用锁(lock)。
同步代码块:将可能会发生线程安全问题的代码,用synchronized给包括起来。
synchronized(锁对象){
可能会发生线程冲突问题
}
同步函数:在方法上修饰synchronized 称为同步函数。(锁对象是当前this对象)
静态同步函数:方法上加上static关键字,使用synchronized 关键字修饰(锁对象当前类字节码对象)
7、多线程三大特性
原子性:一个操作或者多个操作 要么全部执行成功,要么就都不执行。
可见性:当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
有序性:程序执行的顺序按照代码的先后顺序执行。
8、Java内存模型
共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。
9、什么是Volatile(具备可见性不具备原子性)
Volatile 关键字的作用是变量在多个线程之间可见。
:线程之间是不可见的,读取的是副本,没有及时读取到主内存结果,使用Volatile关键字将解决线程之间可见性, 强制线程每次读取该值的时候都去“主内存”中取值
10、wait()、notify、notifyAll()方法
wait()、notify()、notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态。
锁对象.wait() 使持有该对象的线程把该对象的控制权交出去,然后处于等待状态。
锁对象.notify() 通知某个正在等待这个对象的控制权的线程可以继续运行。
锁对象.notifyAll()方法就会通知所有等待这个对象控制权的线程继续运行。
11、wait与sleep区别?
sleep()方式属于Thread类的,wait()方法属于object类的。
sleep()方法设置休眠时间,时间到了会自动恢复运行,不会释放锁资源。
wait()方法线程会释放锁资源,此线程进入等待状态。
12、JDK1.5-Lock
在 jdk1.5 之后,并发包中新增了 Lock 接口(以及相关实现类)用来实现锁功能,Lock 接口提供了与 synchronized 关键字类似的同步功能,但需要在使用时手动获取锁和释放锁。
---------------------Lock写法
Lock lock = new ReentrantLock(); lock.lock(); try{ //可能会出现线程安全的操作 }finally{ //一定在finally中释放锁 //也不能把获取锁在try中进行,因为有可能在获取锁的时候抛出异常 lock.ublock(); }
|
13、Lock 接口与 synchronized 关键字的区别
https://blog.csdn.net/hanchao5272/article/details/79679919
14、什么是ThreadLoca
ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。