Java集合面试题答案
前言来了来了,50道Java集合面试题也来啦~ 已经上传github:
https://github.com/whx123/JavaHome
1. Arraylist与LinkedList区别可以从它们的底层数据结构、效率、开销进行阐述哈
ArrayList是数组的数据结构,LinkedList是链表的数据结构。
随机访问的时候,ArrayList的效率比较高,因为LinkedList要移动指针,而ArrayList是基于索引(index)的数据结构,可以直接映射到。
插入、删除数据时,LinkedList的效率比较高,因为ArrayList要移动数据。
LinkedList比ArrayList开销更大,因为LinkedList的节点除了存储数据,还需要存储引用。
2. Collections.sort和Arrays.sort的实现原理Collection.sort是对list进行排序,Arrays.sort是对数组进行排序。
Collections.sort底层实现Collections.sort方法调用了list.sort方法list.sort方法调用了Arrays.sor ...
无题
在jdk1.6中做了第synchronized的优化,偏向锁指的是当前只有这个线程获得,没有发生争抢,此时将方法头的markword设置成0,然后每次过来都cas一下就好,不用重复的获取锁
轻量级锁:在偏向锁的基础上,有线程来争抢,此时膨胀为轻量级锁,多个线程获取锁时用cas自旋获取,而不是阻塞状态
重量级锁:轻量级锁自旋一定次数后,膨胀为重量级锁,其他线程阻塞,当获取锁线程释放锁后唤醒其他线程。(线程阻塞和唤醒比上下文切换的时间影响大的多,涉及到用户态和内核态的切换)
自旋锁:在没有获取锁的时候,不挂起而是不断轮询锁的状态
无题
volatile 通过内存屏障
synchronized 通过修饰的程序段同一时间只能由同一线程运行,释放锁前会刷新到主内存
无题
1、互斥条件:一个资源每次只能被一个进程使用。
2、保持和请求条件:一个进程因请求资源而阻塞时,对已获得资源保持不放。
3、不可剥夺性:进程已获得资源,在未使用完成前,不能被剥夺。
4、循环等待条件(闭环):若干进程之间形成一种头尾相接的循环等待资源关系。
如何避免死锁?只要破坏其中任意一个条件,就可以避免死锁
一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。
无题
Java 并发 && 多线程
synchronized 的实现原理以及锁优化?
ThreadLocal原理,使用注意点,应用场景有哪些?
synchronized和ReentrantLock的区别?
说说CountDownLatch与CyclicBarrier 区别
Fork/Join框架的理解
为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?
Java中的volatile关键是什么作用?怎样使用它?在Java中它跟synchronized方法有什么不同?volatile 的实现原理
CAS?CAS 有什么缺陷,如何解决?
如何检测死锁?怎么预防死锁?死锁四个必要条件
如果线程过多,会怎样?
说说 Semaphore原理?
AQS组件,实现原理
假设有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行?
LockSupport作用是?
Condition接口及其实现原理
说说并发与并行的区别?
为什么要用线程池?Java的线程池内部机制,参数作用,几种工作阻塞队列,线程池类型以及使用 ...
无题
前言
个人珍藏的80道Java多线程/并发经典面试题,因为篇幅太长,现在先给出1-10的答案解析哈,后面一起完善,并且上传github哈~
❝
https://github.com/whx123/JavaHome
❞
「公众号:捡田螺的小男孩」
1. synchronized的实现原理以及锁优化?
synchronized的实现原理
synchronized作用于「方法」或者「代码块」,保证被修饰的代码在同一时间只能被一个线程访问。synchronized修饰代码块时,JVM采用「monitorenter、monitorexit」两个指令来实现同步synchronized修饰同步方法时,JVM采用「ACC_SYNCHRONIZED」标记符来实现同步monitorenter、monitorexit或者ACC_SYNCHRONIZED都是「基于Monitor实现」的实例对象里有对象头,对象头里面有Mark Word,Mark Word指针指向了「monitor」Monitor其实是一种「同步工具」,也可以说是一种「同步机制」。在Java虚拟机(HotSpot)中,Monitor是由「Ob ...
无题
如果前一个操作的执行结果必须对后一个操作可见,那就不允许这两个操作进行重排序,且happen-befor具有传递性
无题
这个是在ReentrankLock中实现的,synchronized没有,是用一个队列实现的,在公平锁好理解,就是先进这个队列的,也先出队列获得资源,而非公平锁的话,则是还没有进队列之前可以与队列中的线程竞争尝试获得锁,如果获取失败,则进队列,此时也是要乖乖等前面出队才行
无题
如果一个线程获得过该锁,可以再次获得,主要是用途就是在递归方面,还有就是防止死锁,比如在一个同步方法块中调用了另一个相同锁对象的同步方法块