多线程基础篇
1、进程和线程和管程的区别?
- 进程是操作系统分配资源的最小单位,进程会加载到CPU中运行,每隔一个时间片就会切换。进程之间空间独立,互不影响。
- 线程是操作系统调度的最小单位,他是属于进程。一个进程可以有多个线程,但是一个线程只能有一个进程。进程之间共享进程堆区和方法区,从而很容易达到线程间通信,但也是由于这个导致线程存在安全问题。线程也被称为轻量级线程。
- 管程就是所谓的锁,机制,监视器。每个对象都会有一个监视器。在操作系统称为Mintor监视器,保证同一时间只能有一个线程被保护的资源。JVM同步基于进入和退出实现的,是通过管程对象控制的(也就是锁)。
2、 用户线程和守护线程?
- 用户线程也就是基本的线程,系统提供的线程,做一些核心工作。
- 守护线程是一个服务线程,为用户线程服务,当所有的用户线程结束(也就是程序退出)守护线程也会被回收,JVM退出。
在设置一个线程为守护线程时,在线程start()启动之前设置,不然会抛出异常。
2、 线程存在哪些状态?
- NEW(新建);
- RUNNABLE(准备就绪);
- BLOCKED(阻塞);
- WAITING(不见不散); - 线程处于阻塞状态,等待事件发生
- TIME_WAITING(过时不候); - 线程在规定时间内处于阻塞,超过时间就不管了,
- TERMINATED(终结)
3、wait和sleep区别?
共同点: 两者都是让线程处于阻塞状态。
- wait是Object类提供的方法;sleep是Thread类提供的静态方法
- sleep方法不会释放锁,也不会占用锁,wait会释放锁,前提需要加锁。
- 他们都可以被interupted方法中断。
- 两个方法唤醒之后都是在原来的程序继续执行。
4、并发和并行?
并发: 多个线程使用同一个CPU,CPU通过切换线程达到线程之间同时运行。每过一个时间片就会切换一个线程,从而达到同时运行的效果。但其实不是。并发是多个线程互相抢占CPU资源的。
并行: 多线程使用多个CPU, 不同的CPU共同协助处理这些线程的任务。CPU运行互不影响。并行并不会。并行只有在多CPU才能执行。
5、 管程 - (Java锁)
也就是同步监视器锁,主要是Synchronzied底层实现的原理,保证线程执行的同步操作。Java中每个对象都有一个监视器锁。
6、 用户线程和守护线程
Java当中的线程两种:用户线程、守护线程
用户线程:Java自定义的线程都是用户线程。
守护线程:是一种特殊线程,在后台运行,GC垃圾回收线程。
守护线程的优先级很低, 当主线程结束的时候,守护线程资源回收,但是用户线程仍然可以运行。
在Java当中如何创建守护线程:在执行start方法之前,调用thread.serDaemon(true)方法设置为守护线程。
Java当中的JVM就是守护线程。 垃圾回收就是一个典型的守护线程。
7、 Thread常用的方法
- start:启动线程,
- run:方法为线程执行的内容
- join: a线程调用b线程的join方法, a线程处于阻塞,知道b线程执行完毕。
- yield:释放当前cpu的执行权。
- stop:强制结束当前线程
- isAlive: 判断当前线程是否存货
8、 线程的创建
- 继承实现Thread类,重写run()方法。
- 继承Runnable接口,实现抽象方法run(), 作为Thread的构造器参数构建
- 继承Callable接口,实现里面的call(),借助Future类构建实现。
- 线程池
9、 线程的常用方法
- start() : 启动当前线程, 并调用run()方法
- run() : 线程的执行行为
- currentThread() : 获取当前线程
- getName()、setName() : 获取线程名称和设置线程名称
- join() : a线程调用b线程的join(), a线程阻塞,知道b线程执行完毕
- stop() : 强制关闭当前线程
- sleep() : 线程阻塞
- isAlive() : 判断当前线程是否存活
- yleld() : 主动放弃当前CPU的使用权
10、 线程的生命周期
状态a -> 状态b,哪些方法被调用了,这些方法就是回调方法。
11、线程通信的方式
wait(), notify(), notifyAll()三种方法。
- 这三个方法都必须在同步同步代码块中使用
- wait()让当前线程处于阻塞状态
- notify()和notifyAll()唤醒单个线程和唤醒所有线程
12、Java辅助类
1) CountDownLatch - 计数器, 当计数器为0时,调用await()方法唤醒
2) CyclicBarrier - 循环栅栏,每调用一次await(),栅栏数-1,当为0时,唤醒所有阻塞线程。
3)Semaphore - 信号灯,抢占到信号则执行,没有抢占到则阻塞。
4)线程资源交换
13、Java当中有哪些锁?
1) 可重入锁和不可重入锁: 可重入锁是已经获取到锁资源,再次获取锁资源时直接获取,不需要抢占。反之为不可重入锁。
2)乐观锁和悲观锁:
悲观锁:同一时间只有一个线程抢占到锁,其他线程都阻塞。
3)公平锁和非公平锁:
4)独占锁和共享锁: 举例读写锁。
5)独占锁 -> 读写锁 -> 邮戳锁
读写锁:1)读锁和读锁之间共享,读锁和写锁互斥,写锁和写锁互斥。
读写锁的缺点:1)一直被读线程抢占,而写锁资源没有被抢占。 写线程饿死。
