1,为什么说 synchronized 是⼀种悲观锁?乐观锁的实现原理⼜是什 么?什么是CAS,它有什么特性?
因为它的并发策略是悲观的,不管是否竞争,任何数据操作都要被加锁,用户态核心态转换,维护锁计数器和检查线程是否阻塞是否需要被唤醒
乐观锁:对于数据冲突保持一种乐观的态度,操作数据时不会对操作的数据加锁(这使得多个任务可以并行的对数据进行操作)
CAS(是乐观锁的核心算法)一般操作三个数:内存对象(V),预期原值(A),新址(B),并且是一般是内存值和预期值相同时,才将内存值修改为新值,
特性:避免使用互斥锁
2,说一说 jvm 常见垃圾回收器和特点
按内存来划分,年轻代回收器有:
1,Serial:是一个串行的垃圾回收器
2ParNew:是Serial的并行版本
3,Paraller Scavenge:也是一个并行的垃圾回收器,区别在于他注意吞吐量,
年轻代的三个垃圾回收器采用的都是复制算法,所以在回收垃圾的时候会暂停所有线程
老年代回收器
1,Serial Old:是一个serial老年代版本,串行,采用标记-整理算法,同样会STW(垃圾回收的过程会出现阻塞)
2,Paraller Old:是Paraller Scavenge的老年代版本,并行,采用的是标记-清除算法,会STW,注重吞吐量
3,CMS:注重低延迟,采用标记-清除算法,分为四个阶段,初始标记.并发标记,重新标记,清除标记,在初始化和标记阶段是并行的,会STW,其余两个阶段是并发执行与用户线程同时执行,由于采用了标记-清除算法,会产生空间碎片,最后整堆收集器:G1收集器
3,HashTable、HashMap、TreeMap 的区别
1,HashTable,HashMap,TreeMap都实现了Map接口,都是以键值对的形式操作数据和储存数据
2,HashTable是java早期提供的,方法是同步的(加了synchronized),key和value都不能为空,
3,HashMap的方法是不同步的,支持key和Value为null的情况,行为基本和HashTable一致.由于HashTable是同步的性能开销比较大,所以推荐使用HashMap
4,HashMap采用get和put操作时,基本可以达到常熟时间的性能
5,TreeMap是一种基于红黑树的一种提供顺序访问的Map,和HashMap不同,它的get和put操作的时间复杂度是0(log(n)).具体顺序由指定的Comparator来决定,或者根据key的具体顺序来决定
4. ConcurrentLinkedQueue 和 LinkedBlockingQueue 有什么区别
首先两个都是线程安全的队列,都可以使用生产者消费者模型
LinkedBlockingQueue是阻塞队列,好处是:多线程操作时不需要额外同步,由于具有插入和移除的双重阻塞功能,对插入和移除进行阻塞,队列会自动平衡负载,从而减少生产者和消费者的速度差距
由于LinkedBlockingQueuer有阻塞功能,是基于锁实现的,当有多个消费线程消费的时候,队列为空时,消费线程会阻塞 ,有元素时还需要将消费者唤醒,导致用户态和内核态切换频繁,消耗系统资源,LinkedBlockingQueue更适合单线程插入,多线程取出,就多个生产者和一个消费者
ConcurrentLinkedQueue是非阻塞的队列,采用CAS+自旋,解决多线程之间的竞争,并不适合多写入操作,当多个线程共享访问一个公共集合时,ConcurrentLinkedQueue是个好的选择,ConcurrentLinkedQueue更适合多个线程插入,单核线程取出
5,聊一聊并行和并发的区别?
相同点:
并行和并发相同的目标都是提高CPU的使用率,将CPU的性能压榨出来
不同点:
1,并行在多处理器系统中出现,并发可以在单处理器和多处理器中出现
2,并行要求程序能同一时间执行多个操作,并发只要求程序看着像同时执行多个操作,其实是交替执行
6,聊一聊 JUC 包下的并发工具
1CountDownLatch,闭锁,一个线程等待一个线程执行完毕后恢复操作,通过计数器来判断是否执行完毕,等待线程执行完毕计数器会变为-1,当CountDownLatch的值为0后无法恢复,这就是闭锁
2,CyclicBarrier,循环栅拦,一组线程同时到达临界点后再同时恢复
3,SemaPhore,信号量,SemaPhore是synchronized或者Lock的加强版,作用是控制线程的并发数量
4,Exchanger,线程交换器,Exchanger类允许两个线程之间定义同步点,当两个线程到达同步点时,他们交换数据
7,Java 中提供的线程池种类,及其特点!
线程池的使用场景
1,单个任务的处理时间短
2,需要处理的任务数量大
提供的四种线程池
1,newCachedThreadPool,创建一个可根据需求创建线程的线程池,对于短期内异步任务的程序而言,这些线程池通常可以提高程序新嗯呢该
2,Single Thread Executor只有一个线程的线程池
3,newFixedThreadPool创建一个指定线程数的线程池,
4newScheduledThreadPool,创建一个线程池,它可延迟执行或者定期执行
8.synchronized 底层如何实现?什么是锁升级、降级!
靠monitorenter和monitorexit实现的
JDK的优化提供了三个不同的Monitor实现
1偏斜锁
2轻量锁
3重量锁
JVM优化synchronized运行机制就叫锁的升级
9,传输层上的 TCP 和 UDP 区别
1,UDP无连接,TCP面向连接
2,UDP创术可靠性不保证,TCP可靠传输
3,UDP单播,广播,任播的连接方式,TCP是单播
4,UDP报文数据传输方式,TCP字节流传输方式
5,UDP不使用阻塞控制,TCP使用阻塞控制
6,UDP不支持流量控制,TCP支持流量控制
7,UDP是8字节的报文开销,TCP是20-60字节
10,http 协议1.0 和 .1 版本区别
- HTTP/1.0协议使用非持久连接,即在非持久连接下,一个tcp连接只传输一个Web对象;
HTTP/1.1默认使用持久连接,在持久连接下,不必为每个Web对象的传送建立一个新的连接,一个连接中可以传输多个对象! - HTTP 1.0不支持Host请求头字段,WEB浏览器无法使用主机头名来明确表示要访问服务器上的哪个WEB站点,这样就无法使用WEB服务器在同一个IP地址和端口号上配置多个虚拟WEB站点。
在HTTP 1.1中增加Host请求头字段后,WEB浏览器可以使用主机头名来明确表示要访问服务器上的哪个WEB站点,这才实现了在一台WEB服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点。此外HTTP 1.1还提供了与身份认证、状态管理和Cache缓存等机制相关的请求头和响应头。