做网站需要什么软件教程,电子商务网站建设的答案,免费学校网站管理系统,Wordpress建站的前言
本来想着给自己放松一下#xff0c;刷刷博客#xff0c;突然被几道面试题难倒#xff01;SynchronizedMap和ConcurrentHashMap有什么区别#xff1f;什么是线程安全#xff1f;Thread类中的yield方法有什么作用#xff1f;Java线程池中submit() 和 execute()方法有…前言
本来想着给自己放松一下刷刷博客突然被几道面试题难倒SynchronizedMap和ConcurrentHashMap有什么区别什么是线程安全Thread类中的yield方法有什么作用Java线程池中submit() 和 execute()方法有什么区别似乎有点模糊了那就大概看一下面试题吧。好记性不如烂键盘
*** 12万字的java面试题整理 *** *** java核心面试知识整理 ***
SynchronizedMap和ConcurrentHashMap有什么区别
SynchronizedMap()和Hashtable一样实现上在调用map所有方法时都对整个map进行同步。所以只要有一个线程访问map其他线程就无法进入map。 而ConcurrentHashMap的实现却更加精细它对map中的所有桶加了锁。而如果一个线程在访问ConcurrentHashMap某个桶时其他线程仍然可以对map执行某些操作。
所以ConcurrentHashMap在性能以及安全性方面明显比Collections.synchronizedMap()更加有优势。同时同步操作精确控制到桶这样即使在遍历map时如果其他线程试图对map进行数据修改也不会抛出ConcurrentModificationException。
什么是线程安全
线程安全就是说多线程访问同一段代码不会产生不确定的结果。 又是一个理论的问题各式各样的答案有很多我给出一个个人认为解释地最好的 如果你的代码在多线程下执行和在单线程下执行永远都能获得一样的结果那么你的代码就是线程安全的。这个问题有值得一提的地方就是线程安全也是有几个级别的
不可变 像String、Integer、Long这些都是final类型的类任何一个线程都改变不了它们的值要改变除非新创建一个因此这些不可变对象不需要任何同步手段就可以直接在多线程环境下使用绝对线程安全 不管运行时环境如何调用者都不需要额外的同步措施。要做到这一点通常需要付出许多额外的代价Java中标注自己是线程安全的类实际上绝大多数都不是线程安全的不过绝对线程安全的类Java中也有比方说CopyOnWriteArrayList、CopyOnWriteArraySet相对线程安全 相对线程安全也就是我们通常意义上所说的线程安全像Vector这种add、remove方法都是原子操作不会被打断但也仅限于此如果有个线程在遍历某个Vector、有个线程同时在add这个Vector99%的情况下都会出现ConcurrentModificationException也就是fail-fast机制。线程非安全这个就没什么好说的了ArrayList、LinkedList、HashMap等都是线程非安全的类
Thread类中的yield方法有什么作用
Yield方法可以暂停当前正在执行的线程对象让其它有相同优先级的线程执行。它是一个静态方法而且只保证当前线程放弃CPU占用而不能保证使其它线程一定能占用CPU执行yield()的线程有可能在进入到暂停状态后马上又被执行。
Java线程池中submit() 和 execute()方法有什么区别
两个方法都可以向线程池提交任务execute()方法的返回类型是void它定义在Executor接口中,而submit()方法可以返回持有计算结果的Future对象它定义在ExecutorService接口中它扩展了Executor接口其它线程池类像ThreadPoolExecutor和ScheduledThreadPoolExecutor都有这些方法。