Atomic的实现原理:
在这里采用了CAS操作,每次从内存中读取数据然后将此数据和+1后的结果进行CAS操作,如果成功就返回结果,否则重试直到成功为止。
/**
* 一,AtomicInteger 是如何实现原子操作的呢?
*
* 我们先来看一下getAndIncrement的源代码:
* public final int getAndIncrement() {
* for (;;) {
* int current = get(); // 取得AtomicInteger里存储的数值
* int next = current + 1; // 加1
* if (compareAndSet(current, next)) // 调用compareAndSet执行原子更新操作
* return current;
* }
* }
*
* 这段代码写的很巧妙:
* 1,compareAndSet方法首先判断当前值是否等于current;
* 2,如果当前值 = current ,说明AtomicInteger的值没有被其他线程修改;
* 3,如果当前值 != current,说明AtomicInteger的值被其他线程修改了,这时会再次进入循环重新比较;
*
* 注意这里的compareAndSet方法,源代码如下:
* public final boolean compareAndSet(int expect, int update) {
* return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
* }
*
* 调用Unsafe来实现
* private static final Unsafe unsafe = Unsafe.getUnsafe();
*
* 二,java提供的原子操作可以原子更新的基本类型有以下三个:
*
* 1,AtomicBoolean
* 2,AtomicInteger
* 3,AtomicLong
*
* 三,java提供的原子操作,还可以原子更新以下类型的值:
*
* 1,原子更新数组,Atomic包提供了以下几个类:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray
* 2,原子更新引用类型,也就是更新实体类的值,比如AtomicReference<User>
* AtomicReference:原子更新引用类型的值
* AtomicReferenceFieldUpdater:原子更新引用类型里的字段
* AtomicMarkableReference:原子更新带有标记位的引用类型
* 3,原子更新字段值
* AtomicIntegerFieldUpdater:原子更新整形的字段的更新器
* AtomicLongFieldUpdater:原子更新长整形的字段的更新器
* AtomicStampedReference:原子更新带有版本号的引用类型的更新器
*
*
*/
进程间通信使用方法
# 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
# 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
# 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
# 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
# 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
# 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
# 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
java的重载实现原理
list,set,map是否都继承了collection
Collection 接口 :Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和List)的通用方法。 Set 和List 都继承了Conllection,Map
TreeSet与 TreeMap
TreeMap:
无序,不允许重复(无序指元素顺序与添加顺序不一致)
TreeMap集合默认会对键进行排序,所以键必须实现自然排序和定制排序中的一种
底层使用的数据结构是二叉树
TreeSet:
TreeSet:
根据构造方法的不用,选择使用自然排序或者比较器排序。
按照实际的需求,可以对元素进行排序。并且保证唯一。
怎么保证的呢?
排序:底层结构是二叉树。按照树节点进行存储和取出。
两种实现:
A:自然排序(元素具备比较性) TreeSet的无参构造,要求对象所属的类实现Comparable接口。
B:比较器排序(集合具备比较性) TreeSet的带参构造,要求构造方法接收一个实现了Comparator接口的对象。 唯一:根据返回值是否为0。
注意:
如果同时有两种方案,以谁为主呢?以比较器为主,以比较器排序为主
方式一对存进集合的对象所属的类实现Comparable接口,进行自然排序
方式二TreeSet的带参构造,要求构造方法接收一个实现了Comparator接口的对象。
NIO使用:
java非阻塞式IO,可以了解了解netty,java本身这个开发难度大;
GC,JVM
使用的一些技术kafka,rocketmq;中间遇到的一些问题,以及解决方法;和为什么要使用这个技术;
Redis分布式数据分布解决方式,数据迁移;
谈谈公司业务,系统架构;
java多线程;为什么使用线程池,线程池实现原理
异常处理,什么境况下会导致堆异常,内存异常等;聊聊一些异常的处理;为什么异常不全部使用try/catch;使用try/catch为什么会有性能影响
线程间同步方式,以及锁的多种实现方式以及区别
Wait与sleep的区别
谈谈java.util.concurrent,以及一些实现原理
shell脚本,linux命定
Switch case:里面一般使用说明类型的值,string行不行,为什么
Mysql连接数不够解决方式,代码层,与系统层
谈谈设计模式,spring中使用的设计模式,以及实现方式
代码一致性锁,分布式锁,mysql的行锁的实现方式与锁的作用
谈谈soa架构,
谈谈dubbo
谈一谈mysql的主从复制原理
谈一谈redis分布式服务
谈一谈自己所在公司的系统架构,业务实现