1.java是否可以开启线程?
不可以,start()方法调用的是本地方法start0(),java无法直接调用
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0)
throw new IllegalThreadStateException();
/* Notify the group that this thread is about to be started
* so that it can be added to the group's list of threads
* and the group's unstarted count can be decremented. */
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
/* do nothing. If start0 threw a Throwable then
it will be passed up the call stack */
}
}
}
private native void start0();
2.并发与并行
-
并发:多个线程操作同一个资源(cpu一核,模拟出来多条线程,快速交替)
- 并发编程的本质:充分利用cpu资源
-
并行:cpu多核,多个线程可以同时执行;线程池
3.线程具有几个状态
6个状态
public enum State {
//新生
NEW,
//运行
RUNNABLE,
//阻塞
BLOCKED,
//等待,一直等
WAITING,
//超时等待
TIMED_WAITING,
//终止
TERMINATED;
}
4.wait/sleep的区别
- 来自不同的类
- wait属于Object
- sleep属于Thread
- 关于锁的释放
- wait会释放锁
- sleep不会释放锁
- 使用范围不同
- wait必须在同步代码块中使用
- sleep可以在任何地方使用
- 是否需要捕获异常
- wait需要捕获异常
- sleep需要捕获异常
5.Lock锁
- Lock锁三部曲:
- Lock lock=new ReentrantLock();
- lock.lock(); //加锁
- finally => lock.unlock(); //解锁
- Synchronized和Lock的区别
- Synchronized是java关键字,Lock是一个java类
- Synchronized无法判断获取锁的状态,Lock可以判断是否获取到了锁
- Synchronized会自动释放锁,Lock必须手动是释放锁,如果不释放锁,会导致 死锁 问题出现
- Synchronized线程1(获得锁,阻塞)、线程2(等待,一直等),Lock锁就不一定会等待下去
- Synchronized可重入锁,不可以中断,非公平,Lock可重入锁,可以判断锁,非公平锁(可以自己设置),Lock所得灵活性远高于Sychronized锁
- Synchronized适合锁少量的代码同步问题,Lock锁适合锁大量的代码同步问题