1.4.1 如何跳出多重循环
在最外侧循环上一行打个标签outer,写法outer:通过break outer 即可跳出多重循环。
1.4.2 抽象方法是否可以是静态、本地、synchronizited方法
都不能,静态方法不能被重写,本地方法native由C实现,抽象方法没有实现,synchronized方法本质上是锁方法所在的类的class对象
1.4.3 map.Entry
将map中的键值对视为一个实体,从而实现map转list,类似理解为元组
1.4.4 concurrentHashMap和hashTable区别
hashTable使用的是全表锁,相当于一个大锁把整个容器锁住,而concurrentHashMap使用分段锁,容器有多个个锁,每个锁锁住一段数据,锁之间不互斥,因此concurrentHashMap效率高于hashTable
1.4.5 启动线程方法
线程只有start方法一种启动方式,线程池也是包装了start方法,start方法是native方法由C实现
1.4.6 线程池队列问题
当任务队列满后,再加入任务时,若当前线程小于maximumPoolSize,则线程池创建线程,若当前线程小于maximumPoolSize,则抛出异常。
1.4.7 如何控制可以访问线程个数
通过SemaPhore的require和releas方法
1.4.8 如何实现B、C线程调用A线程数据
线程BC设置acquire(0),线程Arelease两个线程
1.4.9 lock和synchronized区别
1. lock是一个接口,通过实现类和方法实现 synchronized是java关键字,作用在jvm虚拟机层面
2. synchronized只能等待锁的释放,而lock可以主动解锁
3. synchronized出现异常是会自动释放锁,而lock不会
4.lock可通过trylock通知锁的状态,而synchronized不能
5. 调度层面,synchronized通过Object的wait、notify、notifyAll实现,而lock则通过Condition类
6.lock基于悲观锁,synchronized基于乐观锁,悲观锁认为线程在操作数据时,会有其他线程同时操作数据,因此把数据锁住直到操作完成。乐观锁任务操作数据时不会有其他线程同时操作,因此不会上锁,它是通过CAS(compare and swap)实现,就是通过记录三个值实现,分别是数据内存位置,数据操作前值和操作后预期值,通过对比预期值和你插入新值判断数据操作期间是否有其他线程同时操作数据,若相同插入数据,不同则放弃修改。
6.竞争激烈时,lock的性能要高于synchronized
1.4.10 如何避免死锁
死锁的发生是因为两个线程需要对方的锁资源进行,但都不让步。因此避免死锁可以通过以下方法完成:
1.在使用锁时,顺序加锁
2.使用lock的trylock方法,具体而言,线程A判断在一定时间能能否拿到锁B若不能,释放已持有的锁A