0%

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,是数据结构中的,先进后出。

HashTableHashMap很相似,但HashTable进行了同步处理。

Collections工具类提供了大量的方法,比如对集合的排序、查找等常用的操作。同时也通过了相关了方法创建同步容器类

阅读全文 »

Java同步组件概况

  • CountDownLatch : 是闭锁,通过一个计数来保证线程是否一直阻塞
  • Semaphore: 控制同一时间,并发线程数量
  • CyclicBarrier:字面意思是回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。
  • ReentrantLock:是一个重入锁,一个线程获得了锁之后仍然可以反复加锁,不会出现自己阻塞自己的情况。
  • Condition:配合ReentrantLock,实现等待/通知模型
  • FutureTask:FutureTask实现了接口Future,同Future一样,代表异步计算的结果。
阅读全文 »

线程的生命周期

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()方法,则该线程的生命周期结束

阅读全文 »

Collections

常用三种集合类:Set、List、Map

Set

Sets表示已sorted元素的集合。 集不允许重复的元素。 Set接口不能保证以任何可预测的顺序返回元素。 尽管某些Set实现以natural ordering存储元素并保证该顺序。

实现Set接口的一些有用的类是EnumSetCopyOnWriteArraySetEnumSetHashSetLinkedHashSetTreeSet

List

Lists表示元素的ordered集合。 使用列表,我们可以按元素的整数索引(列表中的位置)访问元素,并在列表中搜索元素。 索引从0开始,就像一个数组。

实现List接口的一些有用的类是ArrayListCopyOnWriteArrayListLinkedListStackVector

Map

Map接口使我们能够将数据存储在key-value pairs (键应该是不可变的)。 映射不能包含重复的键; 每个键最多可以映射到一个值。

Map界面提供了三个集合视图,这些视图允许将地图的内容视为一组键,一组值或一组键-值映射。 一些地图实现(例如TreeMap类)对其顺序做出特定的保证。 其他的(例如HashMap类)则没有。

实现Map接口的一些有用的类是ConcurrentHashMapConcurrentSkipListMapEnumMapHashMapHashtableIdentityHashMapLinkedHashMapPropertiesTreeMapWeakHashMap

非常用集合类

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类均以其特定实现覆盖这些函数,因此它们在此类集合中的行为正确。 我们还需要确保在用户定义的自定义类中正确覆盖了这些功能。

来源:

https://rumenz.com/java-topic/java-collections/index.html

JAVA-NIO,IO与BIO

概念:

1.BIO:同步阻塞式IO,数据的读写必须阻塞在一个线程内等待其完成

适用于活动连接数不高的场景

2.NIO:同步非阻塞式IO

NIO与IO的区别

1.NIO流是非阻塞IO,而IO是阻塞式IO

2.IO面向流,而NIO棉线缓冲区(buffer)

3.通道,NIO通过channel(通道)进行读写

4.选择器,NIO中选择器(Selectors),而IO没有,NIO通过选择器来处理通道

Java异常机制

作用:使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,提高程序健壮性。

异常架构

exception

阅读全文 »

方法论

一、微服务架构

1.一组小的服务

2.独立的进程

3.轻量级通信

4.基于业务能力

5.独立部署

6.无集中式管理

二、微服务的利弊

1.利:

1)强模块化边界

2)可独立部署

3)技术多样性

2.弊:

1)分布式复杂性

2)最终一致性

3)运维复杂性

4)测试复杂性

阅读全文 »

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中除了创建对象之后还有一个重点的点就是填充属性

阅读全文 »

SpringBoot

Springboot是Spring框架的脚手架,以达到快速构建项目,预置第三方配置,开箱即用的目的。

Springboot两大核心:

  • Spring boot如何实现自动化配置(简化配置核心)

    • 基于configuration、EnableXXX、Condition
  • spring-boot-starter

阅读全文 »