Java IO流

Java IO流

java io流知识体系(引用自pdai

Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。

Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。

一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。

阅读更多

java反射

反射

Java反射机制是在运行状态中,对于任何一个类,都能获得它的所有属性和方法,对于任何一个对象,都能够调用它的任意一个方法和属性。

RTTI(Run-Time Type Identification)运行时类型识别。其作用是在运行时识别一个对象的类型和类的信息。主要有两种方式:一种是“传统的”RTTI,它假定我们在编译时已经知道了所有的类型;另一种是“反射”机制,它允许我们在运行时发现和使用类的信息。反射就是把java类中的各种成分映射成一个个的Java对象。如果要动态获取到这些信息,需要依靠Class对象。Class类对象将一个类的方法、变量等信息告诉运行的程序。

阅读更多

缓存读写策略

Cache Aside Pattern(旁路缓存模式)

Cache Aside Pattern适合读多写少的场景。Cache Aside Pattern中服务端需要同时维系DB和cache,并且最终的结果以DB为准。

下面是该策略模式下缓存读写步骤。

写:

  • 首先更新数据库
  • 然后直接删除cache中的数据
阅读更多

ThreadLocal详解

ThreadLocal解析

本文参照一枝花算不算浪漫

ThreadLocal的特点:

  • 线程并发:在多线程场景下
  • 传递数据:可以通过ThreadLocal在同一线程,不同组件中传递公共变量
  • 线程隔离:每个线程的变量都是独立的,不会相互影响

主要探讨以下问题:

  • ThreadLocal的key是弱引用,那么在ThreadLocal.get()的时候,发生GC之后,key是否为null?
  • ThreadLocal中ThreadLocalMap的数据结构?
  • ThreadLocalMap的Hash算法?
  • ThreadLocalMap的扩容机制?
  • ThreadLocalMap中过期key的清理机制?探测式清理和启发式清理流程?
  • ThreadLocalMap.set()方法实现原理?
  • ThreadLocalMap.get()方法实现原理?
阅读更多

Redis面经(持续更新)

缓存与数据库双写不一致的问题

  1. 延迟双删
  2. 内存队列
  3. 设置缓存过期时间
  4. 读多写多的场景,使用缓存是否有意义?
  5. 不用缓存,会出现数据穿透,数据库无法承载高并发
  6. canal
  7. 针对第五点,怎么办?(tidb)
阅读更多

Java常见并发容器总结

Java常见并发容器总结

JDK提供的并发容器大部分都在java.util.concurrent(juc)

  • ConcurentHahsMap:线程安全的HashMap
  • CopyOnWriteArrayList:线程安全的List,适用于读多写少的场景。
  • ConcurrentLinkedQueue:高效的并发队列,使用链表实现。可以当作一个线程安全的LinkedList,这是一个非阻塞队列。
  • BlockingQueue:这个一个接口,JDK内部通过链表、数组等方式实现了这个接口。表示阻塞队列,适合用于作为数据共享的通道。
  • ConcurrentSkipListMap:线程安全的跳表。
阅读更多

Atomic原子类总结

Atomic原子类

Atomic是基于unsafe类和自旋操作实现的,要理解Atomic首先需要理解CAS。Atomic是指一个操作是不可中断的,即使在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。

所以,所谓源自类就说具有原子/原子操作特征的类。根据操作的数据类型,可以讲JUC包中的原子类分为4类。

要理解Atomic首先得了解CAS,CAS(Compare and Swap),其功能就是判断内存中的某个值是否与预期的值相等,相等就用新值更新旧值,否则就不更新。Java中CAS是基于unsafe类首先的,所有的unsafe类中的方法都是native(原生)方法,直接调用操作系用底层资源执行任务。

阅读更多

AQS原理以及AQS同步组件总结

AQS介绍

AQS全称(AbstractQueuedSynchronizer),即抽象队列同步器。该类位于java.util.concurrent.locks包下。

AQS是一个抽象类,主要用来构建锁和同步器。AQS 为构建锁和同步器提供了一些通用功能的是实现,因此,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如 ReentrantLockSemaphore,其他的诸如 ReentrantReadWriteLockSynchronousQueueFutureTask(jdk1.7) 等等都是基于 AQS 的。

阅读更多

从ReentrantLock的角度分析AQS的原理以及应用

从ReentrantLock的角度分析AQS的原理以及应用

本文转载自美团技术团队从ReentrantLock的实现看AQS的原理及应用

前言

Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于AbstractQueuedSynchronizer(简称为AQS)实现的。AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。本文会从应用层逐渐深入到原理层,并通过ReentrantLock的基本特性和ReentrantLock与AQS的关联,来深入解读AQS相关独占锁的知识点,同时采取问答的模式来帮助大家理解AQS。由于篇幅原因,本篇文章主要阐述AQS中独占锁的逻辑和Sync Queue,不讲述包含共享锁和Condition Queue的部分(本篇文章核心为AQS原理剖析,只是简单介绍了ReentrantLock,感兴趣同学可以阅读一下ReentrantLock的源码)。

下面列出本篇文章的大纲和思路,以便于大家更好地理解:

阅读更多

Java线程池介绍

线程池

为什么要使用线程池?

池化技术 (Pool) 是一种很常见的编程技巧,在请求量大时能明显优化应用性能,降低系统频繁建连的资源开销。我们日常工作中常见的有数据库连接池、线程池、对象池等,它们的特点都是将 “昂贵的”、“费时的” 的资源维护在一个特定的 “池子” 中,规定其最小连接数、最大连接数、阻塞队列等配置,方便进行统一管理和复用,通常还会附带一些探活机制、强制回收、监控一类的配套功能。

普通情况下,我们需要使用线程的时候就直接去创建一个线程,这样子操作的方式十分简单,但是在高并发的情况下就会产生问题:

并发的线程数量过多,而每个线程完成其任务后便会被销毁,往往其执行的时间很短,这样频繁地创建线程就会大大降低系统的效率,因为频繁创建和销毁线程时间的开销很大。

阅读更多
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×