Java多线程面试、笔试方向---后续补充
1.ThreadLocal类
线程级别的局部变量,为每个使用该变量的线程提供一个独立的变量副本,每个线程修改副本时不影响其他线程对象的副本。
线程级别的局部变量,为每个使用该变量的线程提供一个独立的变量副本,每个线程修改副本时不影响其他线程对象的副本。
ThreadLocal实例通常作为静态私有字段出现在一个类中。
2.什么情况会抛出InvalidMonitorStateException异常
调用Object.wait()/Object.notify()/Object.notifyAll()中的任何一个方法时,如果当前线程没有获得该对象的锁,那么就会抛出 IllegalMonitorStateException 的异常
3.Object.wait()和Thread.sleep()
Object.wait(),在拥有该对象锁的情况下,释放该对象锁。一旦线程重新获取到该对象的锁时,方法返回。
Object.notify()
Thread.sleep():让出CPU分配的执行时间,但是不释放该线程拥有的锁。
4.静态方法上使用同步
如果一个静态方法被申明为synchronized,则等同于在这个方法上调用synchronized(类.class)。
2.什么情况会抛出InvalidMonitorStateException异常
调用Object.wait()/Object.notify()/Object.notifyAll()中的任何一个方法时,如果当前线程没有获得该对象的锁,那么就会抛出 IllegalMonitorStateException 的异常
3.Object.wait()和Thread.sleep()
Object.wait(),在拥有该对象锁的情况下,释放该对象锁。一旦线程重新获取到该对象的锁时,方法返回。
Object.notify()
Thread.sleep():让出CPU分配的执行时间,但是不释放该线程拥有的锁。
4.静态方法上使用同步
如果一个静态方法被申明为synchronized,则等同于在这个方法上调用synchronized(类.class)。
当一个线程进入同步静态方法中时,其他线程不能进入这个类的任何静态同步方法。
5.死锁
死锁就是两个或两个以上的线程被无限的阻塞,线程之间相互等待所需资源。
可能发生在以下情况:
当两个线程相互调用Thread.join();
当两个线程使用嵌套的同步块,一个线程占用了另外一个线程必须的锁,互相等待时被阻塞就有可能出现死锁。
6.ReentrantLock:
等待可中断:tryLock(long timeout,TimeUnit unit)当持有锁的线程长期不释放锁时,正在等待的线程可以选择放弃等待,改为处理其他事情。
公平锁:多个线程在等待同一个锁时,必须按照申请锁的事件顺序来依次获取锁;而非公平锁在被释放时,任何一个等待锁的线程都有机会获得锁。
Synchronized 中的锁是非公平锁,ReentrantLock 默认也是非公平锁。tryLock()打破公平性,如果该锁没有被另一个线程保持,立即返回true值,并将锁的保持计数器置1。
锁绑定多个条件:一个ReentrantLock对象可以同时绑定多个Condition对象。
7.线程状态:
新建 NEW:
运行 RUNNABLE:
无限期等待 WAITING:等得其他线程显式地唤醒。
没有设置 Timeout 参数的 Object.wait();没有设置 Timeout 参数的 Thread.wait()。
限期等待 TIMED_WAITING:在一定时间之后会由系统自动唤醒。
设置 Timeout 参数的 Object.wait();设置 Timeout 参数的 Thread.wait();Thread.sleep()方法。
阻塞 BLOCKED:等待获取一个排它锁,等待进入一个同步区域。
结束 TERMINATED:
5.死锁
死锁就是两个或两个以上的线程被无限的阻塞,线程之间相互等待所需资源。
可能发生在以下情况:
当两个线程相互调用Thread.join();
当两个线程使用嵌套的同步块,一个线程占用了另外一个线程必须的锁,互相等待时被阻塞就有可能出现死锁。
6.ReentrantLock:
等待可中断:tryLock(long timeout,TimeUnit unit)当持有锁的线程长期不释放锁时,正在等待的线程可以选择放弃等待,改为处理其他事情。
公平锁:多个线程在等待同一个锁时,必须按照申请锁的事件顺序来依次获取锁;而非公平锁在被释放时,任何一个等待锁的线程都有机会获得锁。
Synchronized 中的锁是非公平锁,ReentrantLock 默认也是非公平锁。tryLock()打破公平性,如果该锁没有被另一个线程保持,立即返回true值,并将锁的保持计数器置1。
锁绑定多个条件:一个ReentrantLock对象可以同时绑定多个Condition对象。
7.线程状态:
新建 NEW:
运行 RUNNABLE:
无限期等待 WAITING:等得其他线程显式地唤醒。
没有设置 Timeout 参数的 Object.wait();没有设置 Timeout 参数的 Thread.wait()。
限期等待 TIMED_WAITING:在一定时间之后会由系统自动唤醒。
设置 Timeout 参数的 Object.wait();设置 Timeout 参数的 Thread.wait();Thread.sleep()方法。
阻塞 BLOCKED:等待获取一个排它锁,等待进入一个同步区域。
结束 TERMINATED: