数据结构
文章平均质量分 57
fhxyryxc
这个作者很懒,什么都没留下…
展开
-
Netty模型
在Netty里,Channel是通讯的载体,而ChannelHandler负责Channel中的逻辑处理。一个Channel包含一个ChannelPipeline,所有ChannelHandler都会注册到ChannelPipeline中,并按顺序组织起来。ChannelPipeline:双向链表。每个节点是ChannelHandlerContext。ChannelHandlerContext:关联一个ChannelHandler。ChannelHandler:数据处理逻辑。Netty的Cha..原创 2021-03-29 16:05:15 · 169 阅读 · 0 评论 -
Reactor模型
单Reactor单线程在这种实现方式中,dispatch方法是同步阻塞的!!!所有的IO操作和业务逻辑处理都在NIO线程(即Reactor线程)中完成。服务器端用一个线程通过多路复用搞定所有IO操作,编码简单,清晰明了,但是如果客户端连接数量较多,将无法支撑。只有一个线程,无法完全发挥出多核CPU的性能,Handler在处理某个连接上的业务时,整个进程无法处理其他连接事件,很容易导致性能瓶颈。线程意外终止,或者进入死循环,会导致整个系统通信模块不可用,不能接受和处理外部消息,造成节点故障。单Re转载 2021-03-26 15:26:41 · 113 阅读 · 0 评论 -
NIO-Buffer-Channel
Channelimport java.nio.channels.Channel;public interface Channel extends Closeable { public boolean isOpen(); public void close() throws IOException;}public static void exampleForChannel() throws IOException { ByteBuffer byteBuffer = ByteBuffer.all转载 2021-03-24 17:35:47 · 57 阅读 · 0 评论 -
BIO
同步并阻塞,一个连接对应一个线程,Server端压力大,适用于连接数目小且固定的架构流程Server端,启动ServerSocketClient端,启动ClientSocketClient 发出请求后,先咨询Server是否有线程响应,如果没有则会等待或者被拒绝如果有响应,Client线程会等待请求结束后才继续执行其他操作案例...转载 2021-03-24 13:37:08 · 61 阅读 · 0 评论 -
volatile
volatile 可以保证线程可见性且提供了一定的有序性,禁止指令重排序,但是无法保证原子性。volatile 在多线程开发中保证了共享变量的“可见性”,不会引起线程上下文的切换和调度。volatile 是无法保证复合操作的原子性。如果某个线程对 volatile 修饰的共享变量进行更新,那么其他线程可以立马看到这个更新,这就是所谓的线程可见性。在程序运行中,会将运行所需要的数据复制一份到 CPU 高速缓存中,在进行运算时 CPU 不再也主存打交道,而是直接从高速缓存中读写数据,只有当运行结束后,才原创 2021-03-22 14:36:22 · 65 阅读 · 0 评论 -
synchronized
普通同步方法,锁是当前实例对象静态同步方法,锁是当前类的 class 对象同步方法块,锁是括号里面的对象同步代码块是使用 monitorenter 和 monitorexit 指令实现的;同步方法(需要看JVM底层实现)依靠的是方法修饰符上的ACC_SYNCHRONIZED 实现在 JVM 中 monitorenter 和 monitorexit 字节码依赖于底层的操作系统的Mutex Lock 来实现的,但是由于使用 Mutex Lock 需要将当前线程挂起并从用户态切换到内核态来执行,这种切原创 2021-03-22 11:58:31 · 73 阅读 · 0 评论 -
HashMap面试题二
hashCode()不要求唯一但是要尽可能的均匀分布,而且算法效率要尽可能的快。ArrayList集合加入1万条数据,应该怎么提高效率?因为ArrayList的底层是数组实现,并且数组的默认值是10,如果插入10000条要不断的扩容,耗费时间,所以我们调用ArrayList的指定容量的构造器方法ArrayList(int size) 就可以实现不扩容,就提高了性能。为什么重写 equals() 时一定要重写 hashCode()?因为 Java 规定,如果两个对象 equals 比较相等(结果为转载 2021-03-22 11:44:55 · 55 阅读 · 0 评论 -
HashMap面试题一
HashMap面试题汇总hashmap-JDK7JDK8数据结构数组+链表数组+链表/红黑树链表插入头插法尾插法key==nulltable[0]-Iterator去删除元素modCount 实现 fail-fast-resize头插法,链表数据顺序翻转。多线程会造成循环链表尾插法hash实现(h = key.hashCode()) ^ (h >>> 16)EntryNode先判断是否需要扩容转载 2021-03-22 10:59:26 · 252 阅读 · 0 评论 -
JDK8:HashMap
数组+链表+红黑树static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16static final int MAXIMUM_CAPACITY = 1 << 30;static final float DEFAULT_LOAD_FACTOR = 0.75f;static final int TREEIFY_THRESHOLD = 8;static final int UNTREEIFY_THRESHOLD =原创 2020-12-31 09:52:21 · 95 阅读 · 1 评论 -
JDK7:HashMap
数组+链表,存储的是Entry对象static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16static final int MAXIMUM_CAPACITY = 1 << 30;static final float DEFAULT_LOAD_FACTOR = 0.75f;static final Entry<?,?>[] EMPTY_TABLE = {};transient Entry<K,转载 2020-12-30 23:32:39 · 47 阅读 · 0 评论 -
泛型擦除
泛型擦除super和extendJava不能实现真正的泛型,只能使用类型擦除来实现伪泛型上界< ? extends Class>,对于编译器来说,当你指定了一个List< ? extends Fruit>,add的参数也变成了“? extends Fruit”。因此编译器并不能了解这里到底需要哪种Fruit的子类型,因此他不会接受任何类型的Fruit。下界< ? super Class>,如果要从集合中读取类型T的数据,并且不能写入,可以使用 ? extends转载 2020-07-26 23:51:24 · 59 阅读 · 0 评论 -
abstract / interface
abstract抽象类定义一种约定,由子类去实现抽象类不能实例化抽象类中可以含有抽象方法和普通方法抽象类可以理解为"类的模板"抽象类可以有构造方法抽象类中可以有普通成员变量抽象类中的抽象方法的访问权限可以是 public、protected 和(默认类型,虽然 eclipse 不报错,但也不能用,默认类型子类不能继承)。default权限意味着可以被这个类本身和同一个包的类访问。作用域当前类同一个包子类其他包privateoXXXdefaultoo原创 2020-06-04 18:24:54 · 90 阅读 · 0 评论 -
list删除元素
使用Iterator的remove()方法List<String> platformList = new ArrayList<>();platformList.add("A");platformList.add("B");platformList.add("C");Iterator<String> iterator = platformList.iterator();while (iterator.hasNext()) { String platform转载 2020-06-03 22:26:56 · 91 阅读 · 0 评论