Java
文章平均质量分 69
I can丶
这个作者很懒,什么都没留下…
展开
-
Java手写锁Lock(公平、非公平)
public class MyLock2 implements Lock { private AtomicInteger state = new AtomicInteger(0); private Thread currentThread = null; Node head = null; Node tail = null; Sync sync; private class Node { Thread t; Node prev; Node next;原创 2021-09-21 10:07:54 · 245 阅读 · 0 评论 -
Java网络编程——Socket
文章目录服务器端(单线程)服务器端(多线程)客户端服务器端(单线程)public class MySocketServer1 { private int port; private ServerSocket serverSocket; DataInputStream in; DataOutputStream out; public MySocketServer1(int port) throws IOException { this.port = port; s原创 2021-09-18 11:57:28 · 75 阅读 · 0 评论 -
Java手写线程池(不带返回值、带返回值)
文章目录不带返回值带返回值不带返回值public class MyThreadPool { private static final int DEFAULT_THREAD_NUM = 10; private int maxThreadNum; private BlockingQueue<Runnable> queue; // 初始化worker的时候直接调用start方法 // 在run中不断从阻塞队列中获取对象 // 由于已经调用了start方法,是一个新的线原创 2021-09-17 11:51:59 · 242 阅读 · 0 评论 -
Java基础(七)——文件、IO流
文章目录文件、IO流1 流2 BIO3 NIO4 AIO文件、IO流1 流InputStream/Reader:所有的输入流的基类,前者是字节输入流,后者是字符输入流OutputStream/Writer:所有输出流的基类,前者是字节输出流,后者是字符输出流2 BIO同步阻塞IO模型,数据的读取写入必须阻塞在一个线程内等待其完成3 NIO同步非阻塞的IO模型,它支持面向缓冲的,基于通道的IO操作方法应用程序可以一直发送请求,而最后内核返回数据的时候线程依然是阻塞的4 AIO异步原创 2021-04-04 17:34:03 · 62 阅读 · 0 评论 -
Java基础(六)——容器
文章目录容器1 List1.1 ArrayList和Vector区别1.2 ArrayList和LinkedList区别1.3 ArrayList1.4 Arrays.copyOf1.5 Arrays.asList2 Set2.1 如何检查重复3 Map3.1 HashMap和Hashtable区别3.2 HashMap3.2.1 JDK1.7以前3.2.2 JDK1.8以后4 Collections5 使用Iterator在遍历中删除元素容器1 ListArrayList:Object[]数组原创 2021-04-04 17:32:18 · 64 阅读 · 0 评论 -
Java基础(五)——泛型
文章目录泛型泛型泛型本质是参数化类型,操作的数据类型被指定为一个参数// 泛型方法public <E> void fun(E p) { ...}// 泛型类class Box<T> { ...}原创 2021-04-04 17:28:51 · 66 阅读 · 0 评论 -
Java基础(四)——异常、断言、日志
文章目录异常、断言、日志1 异常2 断言3 日志异常、断言、日志在Java语言中,给出了3种处理系统错误的机制抛出一个异常使用断言日志1 异常Error:程序无法处理的错误,无法通过catch捕获Exception:程序本身可以处理的异常,分为受查异常和非受查异常受查异常:如果没有被catch或throw处理的话,无法编译通过非受查异常:即使不处理异常,也可以编译通过无论是否捕获处理异常,finally块都会被执行。如果在try或catch中有return语句,fina原创 2021-04-04 17:27:34 · 115 阅读 · 0 评论 -
Java基础(三)——反射、代理
文章目录反射、代理1 反射2 静态代理3 动态代理反射、代理1 反射反射机制可以用于动态操作Java代码,能够知道任意一个类的属性和方法,能够调用任意一个对象的属性和方法优点:运行时根据类型判断,动态加载类,提高代码灵活度缺点:性能会慢一些,动态操作类增加了安全隐患获取Class类// 通过类获取Class c = XXX.class;// 通过对象实例获取XXX xxx = new XXX();Class c = xxx.getClass();// 传入类的路径Class c =原创 2021-04-04 17:25:55 · 87 阅读 · 0 评论 -
Java基础(二)——面向对象
文章目录面向对象1 继承2 接口2.1 Comparable和Comparator3 内部类3.1 非静态内部类3.2 静态内部类3.3 局部内部类3.4 匿名内部类4 Lambda表达式5 函数式接口面向对象封装:把对象的信息隐藏在对象内部继承:子类可以拥有父类的所有属性和方法,子类可以实现自己的属性和方法多态:一个对象具有多种状态,体现在父类引用指向子类实例、或在程序运行期间确定执行哪个方法1 继承Java中只支持单继承super:子类中使用super关键字访问超类,子类构造函数需要先原创 2021-04-04 17:23:26 · 61 阅读 · 0 评论 -
Java基础(一)——基本语法
文章目录基本语法1 编译和解释共存2 数据类型2.1 常量池技术3 String4 ==和equals()的区别5 equals()和hashCode()6 Java的值传递7 深拷贝和浅拷贝8 重载和重写9 序列化基本语法1 编译和解释共存2 数据类型基本类型位数字节默认值boolean1falsebyte810char162‘u0000’short1620int3240long6480Lfloat原创 2021-04-04 17:20:29 · 71 阅读 · 0 评论 -
Java虚拟机(四)——类加载机制
文章目录类加载机制1 类加载过程1.1 加载1.2 验证1.3 准备1.4 解析1.5 初始化1.6 卸载2 类加载器2.1 双亲委派模型类加载机制1 类加载过程Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制1.1 加载类加载过程的第一步,主要完成下面3件事情:通过全类名获取定义此类的二进制字节流将字节流所代表的静态存储结构转换为方法区的运行时数据结构在内存中生成一个原创 2021-03-21 10:36:24 · 95 阅读 · 0 评论 -
Java虚拟机(三)——类文件结构
文章目录类文件结构1 魔数2 Class文件版本3 常量池4 访问标志5 类索引、父类索引、接口索引集合6 字段表集合7 方法表集合8 属性表集合类文件结构Class文件是一组以8个字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在文件之中,中间没有空隙u4 magic; //Class 文件的标志u2 minor_version;//Class 的小版本号u2 major_version;//Class 的大版本原创 2021-03-21 10:34:05 · 95 阅读 · 1 评论 -
Java虚拟机(二)——垃圾回收与内存分配
文章目录垃圾回收与内存分配1 引用2 如何判断对象需要回收2.1 引用计数算法2.2 可达性分析算法2.3 废弃常量的回收2.4 无用的类的回收3 内存分配4 垃圾收集算法4.1 标记清除算法4.2 标记复制算法4.3 标记整理算法5 垃圾收集器5.1 Serial5.2 ParNew5.3 Parallel Scavenge5.4 Serial Old5.5 Parallel Old5.6 CMS5.7 G15.8 Shenandoah5.9 ZGC6 HotSpot垃圾收集算法6.1 根节点枚举6.2原创 2021-03-21 10:30:06 · 80 阅读 · 0 评论 -
Java虚拟机(一)——内存管理
文章目录内存管理1 运行时数据区域1.1 程序计数器1.2 虚拟机栈1.3 本地方法栈1.4 堆1.5 方法区1.5.1 运行时常量池2 HotSpot虚拟机对象的创建2.1 类加载检查2.2 分配内存2.3 初始化零值2.4 设置对象头2.5 执行init方法3 HotSpot虚拟机对象的内存布局3.1 对象头3.2 实例数据3.3 对齐填充4 HotSpot虚拟机对象的访问定位内存管理1 运行时数据区域1.1 程序计数器较小的内存空间,记录当前线程执行的位置,使得线程切换后可以恢复到正确的执行原创 2021-03-21 10:23:02 · 134 阅读 · 0 评论 -
Java并发(八)——Fork/Join
文章目录Fork/JoinFork/JoinFork/Join框架是一个实现了ExecutorService接口的多线程处理器,采用了分治的思想,将任务递归分解成更小的任务执行采用工作窃取算法,减少线程之间的竞争使用案例class Fibonacci extends RecursiveTask<Integer> { int n; public Fibonacci(int n) { this.n = n; } // 主要的实现逻原创 2021-03-16 19:23:36 · 85 阅读 · 0 评论 -
Java并发(七)——并发容器
文章目录并发容器1 阻塞队列1.1 ArrayBlockingQueue1.2 LinkedBlockingQueue1.3 DelayQueue1.4 PriorityBlockingQueue1.5 SynchronousQueue2 并发Map2.1 HashTable2.2 ConcurrentHashMap2.2.1 JDK 1.72.2.2 JDK 1.82.3 ConcurrentSkipListMap3 并发List3.1 Vector4 并发Set4.1 ConcurrentSkipLis原创 2021-03-16 19:21:14 · 137 阅读 · 1 评论 -
Java并发(六)——CAS、AQS、Lock、通信工具类
文章目录CAS、AQS、Lock、通信工具类1 CAS1.1 Unsafe类1.2 Atomic包2 AQS3 Condition4 ReentrantLock4.1 公平锁部分源码4.2 非公平锁部分源码4.3 总结5 ReentrantReadWriteLock6 StampedLock7 通信工具类7.1 Semaphore7.2 Exchanger7.3 CountDownLatch7.4 CyclicBarrier7.5 PhaserCAS、AQS、Lock、通信工具类1 CASCompar原创 2021-03-16 19:17:54 · 166 阅读 · 0 评论 -
Java并发(五)——锁
文章目录锁1 死锁2 锁的类型2.1 乐观锁和悲观锁2.2 公平锁和非公平锁2.3 独占锁和共享锁2.4 读写锁和排他锁2.5 可重入锁2.6 自旋锁3 锁的等级3.1 偏向锁3.2 轻量级锁3.3 重量级锁3.4 总结锁1 死锁死锁是指两个或两个以上的线程在执行任务过程中,因争夺资源而造成的相互等待的现象产生死锁的条件:互斥条件:指线程对已经获取的资源进行排他性使用,即该资源同时只能由一个线程占用请求并持有条件:指线程已经持有了至少一个资源,但又请求其他资源,如果请求不到则阻塞,但不释放已有原创 2021-03-16 19:13:44 · 60 阅读 · 0 评论 -
Java并发(四)——synchronized、volatile
文章目录synchronized、volatile1 Java内存模型JMM2 伪共享3 指令重排4 synchronized5 volatile6 synchronized和Lock7 synchronized和volatilesynchronized、volatile1 Java内存模型JMM所有共享变量都存储在主存中,每个线程都保存了一份该变量的副本2 伪共享Cache内部是按行存储的,Cache行大小一般为2的幂次数字节由于每次从主存中复制变量到Cache中的是内存块(局部性原理),而原创 2021-03-16 16:34:04 · 140 阅读 · 0 评论 -
Java并发(三)——线程池
文章目录线程池1 简单代码示例2 构造函数参数3 线程池状态4 execute源码5 addWorker源码6 Worker源码7 getTask源码8 四种常见线程池8.1 FixedThreadPool8.2 SingleThreadExecutor8.3 CachedThreadPool8.4 ScheduledThreadPoolExecutor线程池使用线程池的原因创建销毁线程需要消耗资源,线程池可以复用已有的线程控制并发的数量,并发数量过多容易造成服务器崩溃可以对线程做统一管理原创 2021-03-16 16:30:23 · 83 阅读 · 0 评论 -
Java并发(二)——ThreadLocal
文章目录ThreadLocal1 ThreadLocal2 InheritableThreadLocalThreadLocalThreadLocal是JDK提供的线程本地变量,如果创建了一个ThreadLocal变量,则该变量会为每个线程创建一个本地副本,每个线程操作的是本地的自己这个变量,避免多线程的安全问题static ThreadLocal<String> threadLocal = new ThreadLocal<>();static ThreadLocal<原创 2021-03-16 16:26:50 · 79 阅读 · 1 评论 -
Java并发(一)——线程
文章目录线程1 进程和线程的区别2 线程的创建方式2.1 继承Thread类并重写run方法2.2 实现Runnable接口2.3 实现Callable接口2.4 线程池2.5 小结3 线程的通知和等待3.1 wait()函数3.2 wait(long timeout)函数3.3 notify()函数3.4 notifyAll()函数3.5 sleep()函数3.6 yield()函数3.7 join()函数4 线程的中断4.1 void interrupt()4.2 boolean isInterrupt原创 2021-03-16 16:23:56 · 66 阅读 · 0 评论 -
Java设计模式
文章结构设计原则常用模式总结策略模式 Strategy观察者模式 Observer装饰者模式 Decorator工厂方法模式 Factory Method抽象工厂模式 Abstract Factory单件模式 Singleton命令模式 Command适配器模式 Adapter外观模式 Facade模板方法模式 Template Method迭代器模式 Iterator组合模式 Composite状态模式 State代理模式 Proxy动态代理远程代理虚拟代理桥接模式 Bridge生成器模式 Builder原创 2021-01-05 10:42:27 · 910 阅读 · 0 评论 -
Java 函数传递对象是引用传递还是值传递?
函数传递对象是引用传递还是值传递?class A { int val;}public class main { public static void fun(A a, A b) {// a.val = 6; a = b; } public static void main(String[] args) { A a = new A(); A b = new A(); a.val = 5; b.val = 7; System.ou原创 2021-01-27 12:30:15 · 208 阅读 · 0 评论 -
Java List、int数组、Integer数组之间的转换
List和数组的转换 int[] data = {1,2,3}; // int[]转List<Integer> // Arrays.stream(data): int[] -> IntStream // IntStream.boxed(): IntStream -> Stream<Integer> // Stream<Integer>.collect(Collectors.toList()): Stream<In原创 2020-09-26 19:54:56 · 1565 阅读 · 0 评论