Fork,join
ForkJoinTask和ForkJoinPool
JAVA-同步容器
Java同步容器
ArrayList
,HashSet
,HashMap
都是线程非安全的,在多线程环境下,会导致线程安全问题,所以在使用的时候需要进行同步,这无疑增加了程序开发的难度。所以JAVA提供了同步容器
。
同步容器
- ArrayList ===> Vector,Stack
- HashMap ===> HashTable(key,value都不能为空)
- Collections.synchronizedXXX(List,Set,Map)
Vector
实现List
接口,底层和ArrayList
类似,但是Vector
中的方法都是使用synchronized
修饰,即进行了同步的措施。 但是,Vector
并不是线程安全的。
Stack
也是一个同步容器,也是使用synchronized
进行同步,继承与Vector
,是数据结构中的,先进后出。
HashTable
和HashMap
很相似,但HashTable
进行了同步处理。
Collections
工具类提供了大量的方法,比如对集合的排序、查找等常用的操作。同时也通过了相关了方法创建同步容器类
JAVA-JUC同步组件
JAVA-线程的生命周期
线程的生命周期
1.新建状态(New):当程序使用new关键字创建一个线程之后,该线程就处于新建状态,此时jvm为其分配内存,并初始化其成员变量的值
2.就绪状态(Runnable):当线程调用的start()之后,线程就处于继续状态,java虚拟机会为其创建方法调用栈和程序计数器,等待调度运行
3.运行状态(Running):如果处于就绪状态的线程获得了CPU,开始执行run()方法的线程执行体,则该线程处于运行状态
4.阻塞状态(Blocked):当处于运行状态的线程失去所占用的资源后,便进入阻塞状态(获取synchronized锁失败)
4.1.无限等待状态(Waiting):①.调用无参的Object.wait()方法,线程即进入waiting状态
②.调用无参的Thread.join()方法,线程即进入waiting状态
③.调用LockSupport.park()方法,线程即进入waiting状态
4.2.有限等待状态(Timed_Waiting):①.调用带参的Thread.sleep(long millis)方法
②.获得synchronized锁,调用带超时时间的Object.wait(long millis)方法
③.调用各种带超时时间参数的的方法
5.死亡状态(Dead):线程执行完毕或由于异常退出了run()方法,则该线程的生命周期结束
JAVA-集合类
Collections
常用三种集合类:Set、List、Map
Set
Sets表示已sorted元素的集合。 集不允许重复的元素。 Set接口不能保证以任何可预测的顺序返回元素。 尽管某些Set实现以natural ordering存储元素并保证该顺序。
实现Set
接口的一些有用的类是EnumSet , CopyOnWriteArraySet, EnumSet , HashSet , LinkedHashSet和TreeSet 。
List
Lists表示元素的ordered集合。 使用列表,我们可以按元素的整数索引(列表中的位置)访问元素,并在列表中搜索元素。 索引从0
开始,就像一个数组。
实现List
接口的一些有用的类是ArrayList , CopyOnWriteArrayList , LinkedList , Stack和Vector 。
Map
Map接口使我们能够将数据存储在key-value pairs (键应该是不可变的)。 映射不能包含重复的键; 每个键最多可以映射到一个值。
Map界面提供了三个集合视图,这些视图允许将地图的内容视为一组键,一组值或一组键-值映射。 一些地图实现(例如TreeMap类)对其顺序做出特定的保证。 其他的(例如HashMap类)则没有。
实现Map
接口的一些有用的类是ConcurrentHashMap , ConcurrentSkipListMap , EnumMap , HashMap , Hashtable , IdentityHashMap , LinkedHashMap , Properties , TreeMap和WeakHashMap 。
非常用集合类
Stack
Java Stack接口代表经典的堆栈数据结构,其中的元素可以被推入对象的后进先出(LIFO)堆栈。 在堆栈中,我们将元素推到堆栈的顶部,然后再次从堆栈顶部弹出。
Queue
队列数据结构旨在在由使用者线程进行处理之前保存元素(由生产者线程放入)。 除了基本的“收集”操作外,队列还提供其他插入,提取和检查操作。
队列通常但不一定以FIFO(先进先出)的方式对元素进行排序。 一种这样的例外情况是优先级队列,它根据提供的Comparator或元素的自然顺序对元素进行排序。
通常,队列不支持阻止插入或检索操作。 阻塞队列实现类实现了BlockingQueue接口。
实现Map
接口的一些有用的类是-ArrayBlockingQueue,ArrayDeque,ConcurrentLinkedDeque,ConcurrentLinkedQueue,DelayQueue,LinkedBlockingDeque,LinkedBlockingQueue,LinkedList,LinkedTransferQueue,PriorityBlockingQueue,PriorityQueue和SynchronousQueue。
Deque
一个双端队列(发音为“ *deck* ”),支持在两端插入和删除元素。 当双端队列用作队列时,将导致FIFO (First-In-First-Out)行为。 当双端队列用作堆栈时,将产生LIFO(后进先出)行为。
此接口应优先于旧版Stack类使用。 当双端队列用作堆栈时,元素从双端队列的开头被压入并弹出。
实现此接口的一些常见的已知类是ArrayDeque,ConcurrentLinkedDeque,LinkedBlockingDeque和LinkedList。
集合和数组的区别
1.数组是固定长度,集合是可变长度
2.数组可以存储基本类型,也可以存储引用类型;集合只能存储引用类型
3.数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型
三种主要集合类的区别
equals() and hashCode() Methods
许多集合类提供特定的功能,例如排序的元素,没有重复的元素等。要实现此行为,添加的元素(对象)必须正确实现equals() and hashCode() methods
所有Java包装器类和String类均以其特定实现覆盖这些函数,因此它们在此类集合中的行为正确。 我们还需要确保在用户定义的自定义类中正确覆盖了这些功能。
来源:
JAVA-NIO,IO与BIO
JAVA-异常机制
Spring Cloud
Spring-源码总结
Spring IOC
IOC:控制反转,传统使用对象的时候,对象时由使用者控制的,有了Spring之后,可以将整个对象交给容器来帮我们进行管理
DI:依赖注入,将对象的属性注入到具体的对象中,通过@Autowired、@Resource、populateBean方法来完成注入
容器:负责存储对象,使用map结构存储对象,在Spring中存储对象的时候一般有三级缓存:
SingletonObjects存放完整对象、earlySingtonObjects存放半成品对象,SingletonFactory用来存放lambda表达式和对象名称的映射,整个bean的生命周期,从创建到使用到销毁,各个环节都是容器帮我们控制的。
Spring中所有bean都是通过反射生成的,constructor,newInstance,在整个流程中还包含很多扩展点,比如有两个非常重要的接口,BeanFactoryProcessor,BeanPostProcessor,用来实现扩展功能,aop就是在ioc基础之上的一个扩展实现,是通过BeanPostProcessor实现的,Ioc中除了创建对象之后还有一个重点的点就是填充属性