java基础知识-(集合与线程 )

集合

1、Map和ConcurrentHashMap的区别?
后者线程安全

2、hashMap内部具体如何实现的?
Map本身为 key-value的entry 的集合
1.7 数组加链表 --(冲突)
1.8数组 加红黑树–(冲突)

3、如果hashMap的key是一个自定义的类,怎么办?

4、ArrayList和LinkedList的区别,如果一直在list的尾部添加元素,用哪个效率高?
Arraylist

6、ConcurrentHashMap锁加在了哪些地方?
segement
Segment继承了ReentrantLock,表明每个segment都可以当做一个锁。这样对每个segment中的数据需要同步操作的话都是使用每个segment容器对象自身的锁来实现。只有对全局需要改变时锁定的是所有的segment。
1.8 之后使用Node + CAS + Synchronized来保证并发安全进行实现

7、TreeMap底层,红黑树原理
1、 每个结点的颜色只能是红色或黑色。
2、 根结点是黑色的。
3、 每个叶子结点都带有两个空的黑色结点(被称为黑哨兵),如果一个结点n的只有一个左孩子,那么n的右孩子是一个黑哨兵;如果结点n只有一个右孩子,那么n的左孩子是一个黑哨兵。
4、 如果一个结点是红的,则它的两个儿子都是黑的。也就是说在一条路径上不能出现相邻的两个红色结点。
5、 对于每个结点来说,从该结点到其子孙叶结点的所有路径上包含相同数目的黑结点。

8、concurrenthashmap有啥优势,1.7,1.8区别?
1.7 segement 1.8 synchronized+ node + cas

9、ArrayList是否会越界?
不会 ,自增操作

10、什么是TreeMap?
是一个有序的key-value集合,它是通过红黑树实现的。

11、ConcurrentHashMap的原理是什么?
Hashmap的线程安全集合

12、Java集合类框架的基本接口有哪些?

13、为什么集合类没有实现Cloneable和Serializable接口?

14、什么是迭代器?
Iterator it=collection.iterator();

15、Iterator和ListIterator的区别是什么?
Iterator接口定义了3个方法分别是hasNext(),next(),remove()
listIterator 有 add() ,hasprevious() previous() 可以使用 索引定位 nextIndex() previousIndex() 可以对对象进行修改set() 方法

16、快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
快速失败(fail—fast ) java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)
在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception
安全失败(fail—safe)
采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。
由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发Concurrent Modification Exception。java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改。

17、HashMap和Hashtable有什么区别?
Hash 接受 null null的键值对 ,hashmap 非线程安全 hashtable安全 但是 已被 concurrenthashmap 取代

18、ArrayList和LinkedList有什么区别?
一个数组,一个双向链表

19、ArrayList,Vector,LinkedList的存储性能和特性是什么?
Vector线程安全

20、Collection 和 Collections的区别。

21、你所知道的集合类都有哪些?主要方法?

22、List、Set、Map是否继承自Collection接口?
Map没有

23、阐述ArrayList、Vector、LinkedList的存储性能和特性

24、List、Map、Set三个接口存取元素时,各有什么特点?
Set不能存储相同的key ,map 存储 entry 队 list 单个元素

###、线程
1、多线程中的i++线程安全吗?为什么?
非原子性操作

2、如何线程安全的实现一个计数器?
原子类方法
public class Counter {
private AtomicInteger count = new AtomicInteger();
public Counter(){}
public int getCount(){
return count.get();
}
public void increase(){
count.getAndIncrement();
}
}

CountDownLatch 可以实现计数器
CountDownLatch 与 CyclicBarrier 讲解

3、多线程同步的方法
Lock,reentrantlock , synchronized

4、介绍一下生产者消费者模式?

5、线程,进程,然后线程创建有很大开销,怎么优化?
线程池

6、线程池运行流程,参数,策略
corePoolSize --核心线程数
maximumPoolSize–最大线程数
keepAliveTime-- 空闲线程结束的超时时间
unit --表示 keepAliveTime 的单位;
workQueue–存放任务的BlockingQueue<Runnable队列。
BlockingQueue–阻塞队列(BlockingQueue)是java.util.concurrent下的主要用来控制线程同步的工具
https://blog.csdn.net/kuizhu7142/article/details/81330308

7、讲一下AQS吧。
AbstractQueuedSynchronizer
AQS的核心思想是,如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态,如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
CLH(Craig,Landin,and Hagersten)队列是一个虚拟的双向队列,虚拟的双向队列即不存在队列实例,仅存在节点之间的关联关系。
https://blog.csdn.net/mulinsen77/article/details/84583716

12、cyclicbarrier和countdownlatch的区别

13、如何理解Java多线程回调方法?

14、创建线程有几种不同的方式?你喜欢哪一种?为什么?
两种 继承 实现

15、概括的解释下线程的几种可用状态。

16、同步方法和同步代码块的区别是什么?
1.同步方法使用synchronized修饰方法,在调用该方法前,需要获得内置锁(java每个对象都有一个内置锁),否则就处于阻塞状态
代码如: public synchronized void save(){//内容}

2.同步代码块使用synchronized(object){}进行修饰,在调用该代码块时,需要获得内置锁,否则就处于阻塞状态
代码如:
synchronized(object){
//内容
}

17、启动线程有哪几种方式,线程池有哪几种?
4种 newCachedThreadPool
newSingleThreadExecutor
newFixedThreadPool
newScheduledThreadPool

18、在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?

19、sleep() 和 wait() 有什么区别?
Sleep()会导当前线程 让出自己的cpu 但是并不会释放当前同步资源的锁
Wait() 会导致当前线程撤退出自己的同步资源锁, 只有 调用了 notify() 执行了wait方法的线程才会被唤醒,去参与对同步资源锁 的竞争

20、同步和异步有何异同,在什么情况下分别使用他们?举例说明。

21、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。使用内部类实现线程,对j增减的时候没有考虑顺序问题

22、启动一个线程是用run()还是start()?
Start()

23、请说出你所知道的线程同步的方法

25、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用?

26、线程的sleep()方法和yield()方法有什么区别?
Sleep 让线程暂时放弃 cpu一段时间 ,这样可以让 其他低优先级 的 线程可以执行 但是 yield () 只能让 与其相同优先级的线程执行 ,并且不能指定时间
Join 与 yield
Join 在 b中调用 b.join(a) 将a执行完成之后执行 b
Yield 执行完成 b之后 才执行 a
https://blog.csdn.net/reboot123/article/details/22589621

27、当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的synchronized方法B?

28、请说出与线程同步以及线程调度相关的方法

Thread.yield() 方法,暂停当前正在执行的线程对象,把执行机会让给相同或者更高优先级的线程。
join()方法,等待其他线程终止。在当前线程中调用另一个线程的join()方法,则当前线程转入阻塞状态,直到另一个进程运行结束,当前线程再由阻塞转为就绪状态。
setPriority()和getPriority()方法分别用来设置和获取线程的优先级。
Lock,synchroinzed ,reentrantlock
调度: syn: wait notify
Lock: condition(可以使用多个condition 监视器 监视器必须成对 a监视器的await 必须 通过 a的signal 来唤醒 ) Condition.await//condition.signal();

29、举例说明同步和异步
多线程即为异步 加锁了的对象方法就是同步 ,必须等待上一个获取了锁的线程完成,下一个线程才能获取该锁,执行方法
30、什么是线程池(thread pool)?
线程池就是提前创建若干个线程,如果有任务需要处理,线程池里的线程就会处理任务,处理完之后线程并不会被销毁,而是等待下一个任务。由于创建和销毁线程都是消耗系统资源的,所以当你想要频繁的创建和销毁线程的时候就可以考虑使用线程池来提升系统的性能。

31、说说线程的基本状态以及状态之间的关系?

32、如何保证线程安全?

发布了68 篇原创文章 · 获赞 3 · 访问量 5216

猜你喜欢

转载自blog.csdn.net/Hqxcsdn/article/details/88803862