什么是线程安全
当多个线程在访问某一个类(对象或方法)时,这个类都能表现出正确的行为,那么这个类就是线程安全的。
什么是对象锁和类锁
当对象的方法使用synchronized修饰的时候,是对象锁,不同的对象可以同时调用此方法
当类的synchronized方法使用static是类锁,同一时间只能被一个线程调用。
多线程的脏读是如何产生的
当一个对象的set方法未执行完成时,对象的get方法执行,读到错误的数据。解决方法是对get的set方法都加上synchronied修饰
synchronized拥有锁重入的功能如何理解
当一个线程得到对象的锁之后,再次请求此对象可以再次得到锁。
如对象有两个同步方法A,B,A调B也是可以的。
如果父类和子类的方法都实现了同步,子类也可以调用父类的方法。
notify和wait有何不同
notify用于唤醒线程,不释放锁
wait使线程进入阻塞状态,释放锁
如何实现实时的通知
CountDownLatch
AtomicInteger
AtomicInteger,一个提供原子操作的Integer的类。在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的加减操作接口。
ThreadLocal
BlockingQueue 都有哪些方法
header 1 | header 2 | 3 |
---|---|---|
add | 增加一个元索 | 如果队列已满,则抛出一个IIIegaISlabEepeplian异常 |
remove | 移除并返回队列头部的元素 | 如果队列为空,则抛出一个NoSuchElementException异常 |
element | 返回队列头部的元素 | 如果队列为空,则抛出一个NoSuchElementException异常 |
offer | 添加一个元素并返回true | 如果队列已满,则返回false |
poll | 移除并返问队列头部的元素 | 如果队列为空,则返回null |
peek | 返回队列头部的元素 | 如果队列为空,则返回null |
put | 添加一个元素 | 如果队列满,则阻塞 |
take | 移除并返回队列头部的元素 | 如果队列为空,则阻塞 |
remove、element、offer 、poll、peek 其实是属于Queue接口。