ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Java面试之多线程&并发篇(3)
[打印本页]
作者:
饭宝
时间:
2024-11-14 22:39
标题:
Java面试之多线程&并发篇(3)
前言
原来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!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这个Vector,99%的情况下都会出现ConcurrentModificationException,也就是fail-fast机制。
线程非安全这个就没什么好说的了,ArrayList、LinkedList、HashMap等都是线程非安全的类
Thread类中的yield方法有什么作用?
Yield方法可以暂停当前正在执行的线程对象,让其它有相同优先级的线程执行。它是一个静态方法而且只保证当前线程放弃CPU占用而不能保证使其它线程一定能占用CPU,执行yield()的线程有大概在进入到暂停状态后马上又被执行。
Java线程池中submit() 和 execute()方法有什么区别?
两个方法都可以向线程池提交任务,execute()方法的返回类型是void,它界说在Executor接口中,而submit()方法可以返回持有盘算结果的Future对象,它界说在ExecutorService接口中,它扩展了Executor接口,其它线程池类像ThreadPoolExecutor和ScheduledThreadPoolExecutor都有这些方法。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4