基础知识点总结10

1.为什么说synchronized为悲观锁 cas为乐观锁?

Synchronized是从悲观的角度出发:
总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。因此Synchronized我们也将其称之为悲观锁。jdk中的ReentrantLock也是一种悲观锁。

CAS是从乐观的角度出发:
总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。CAS这种机制我们也可以将其称之为乐观锁。

2.并发包:能够讲述ConcurrentHashMap类

为什么要使用ConcurrentHashMap:
(1)HashMap线程不安全,会导致数据错乱.
(2)使用线程安全的Hashtable效率低下。
ConcurrentHashMap类:
(1)在ConcurrentHashMap中,无论是读操作还是写操作都能保证很高的性能
(2)在进行读操作时(几乎)不需要加锁,而在写操作时通过锁分段技术只对所操作的段加锁而不影响客户端对其它段的访问。
(3)在理想状态下,ConcurrentHashMap 可支持16个线程执行并发写操作,及任意数量线程的读操作。
关于它的存储结构
(1)JDK 1.7 中使用分段锁(ReentrantLock + Segment + HashEntry),相当于把一个 HashMap 分成多个段,每段分配一把锁,这样支持多线程访问。锁粒度:基于 Segment,包含多个 HashEntry。
(2)JDK 1.8 中使用 CAS + synchronized + Node + 红黑树。锁粒度:Node(首结点)(实现 Map.Entry<K,V>)。锁粒度降低了。

3.HashMap和hashTable和ConcurrentHashMap在线程方面的安全和效率问题?

HashMap为什么线程不安全?
因为多线程是抢占式调度,两个以上的线程同时对一个map集合,可能会出现数据的丢失,所以线程不安全的。
hashTable为什么线程安全,但是效率低?
因为hashTable加上了锁synchronized的关键字,synchronized是通过互斥的原理,所以效率低了。
ConcurrentHashMap为什么效率高并且安全?
因为ConcurrentHashMap是通过synchronized(分段加锁)+cas机制

4.线程池方式,要会描述Java中线程池运行原理

**线程池:**其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。线程池的思想: 线程可以重复利用
线程池的工作原理:
创建线程池的时候初始化一批线程在线程池中,提交任务到线程池,如果线程池中有空闲的线程,就会分配一条空闲的线程来执行任务,当任务执行完毕,该线程就会回到线程池,供下一次任务使用.如果线程池中没有空闲的线程,那么添加的任务就会添加到任务队列中,进行等待空闲的线程来执行
合理利用线程池能够带来三个好处:
(1)降低资源消耗。(2)提高响应速度。(3)提高线程的可管理性。
线程池的使用:
真正的线程池接口是java.util.concurrent.ExecutorService。因此在java.util.concurrent.Executors线程工厂类里面提供了一些静态工厂,生成一些常用的线程池。
在这里插入图片描述

使用线程池中线程对象的步骤:

  1. 创建线程池对象。
  2. 创建Runnable接口子类对象。(task)
  3. 提交Runnable接口子类对象。(take task)
  4. 关闭线程池(一般不做)。

5.什么是死锁,产生死锁的条件是什么?

死锁:在多线程程序中,使用了多把锁,造成线程之间相互等待.程序不往下走了。
产生死锁的条件
1.有多把锁2.有多个线程3.有同步代码块嵌套

6.线程状态:了解6个状态的具体是什么?
在这里插入图片描述
注意:
• 线程是通过锁对象调用wait()方法进入无线等待状态
• 进入无线等待状态的线程,必须等其他线程使用锁对象调用notify()或者notifyAll()方法唤醒
• 调用wait()方法和调用notify()或者notifyAll()方法的锁对象要一致

public static void sleep(long time) 让当前线程进入到睡眠状态,到毫秒后自动醒来继续执行
public void wait() : 让当前线程进入到等待状态 此方法必须锁对象调用.
public void notify() : 唤醒当前锁对象上等待状态的线程 此方法必须锁对象调用.

6.了解Lambda表达式:函数式编程思想概述,优化,格式和前提条件。

函数式编程思想:尽量忽略面向对象的复杂语法——强调做什么,而不是以什么形式做。
Lambda的格式:(参数类型 参数名称) -> { 代码语句 }
在这里插入图片描述
前提条件:
(1)使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法。无论是JDK内置的Runnable、Comparator接口还是自定义的接口,只有当接口中的抽象方法存在且唯一时,才可以使用Lambda。
(2)使用Lambda必须具有上下文推断。也就是方法的参数或局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值