
Java语言
文章平均质量分 85
xingzhong128
这个作者很懒,什么都没留下…
展开
-
Java简单线程池实现
需要开启新线程执行异步代码的时候通常都是new Thread()创建新的线程对象,创建线程过程中会向系统申请资源,造成任务启动变慢,直接开启的线程没有统一的管理机构,如果用户不断的创建新线程也没办法控制最多启动的线程数;直接开启的线程运行结束后还要做垃圾回收操作,影响整个应用的性能。针对这些问题Java类库中提供了线程池功能,在线程池中会预先分配一些启动好的线程对象,当用户有任务要执行时向线程池...原创 2019-10-20 23:12:05 · 269 阅读 · 0 评论 -
Java线程可见性与原子性
有时候用户希望能够根据需要结束当前的任务,比如某个线程正在下载一个特别大的文件,已经花费了很长时间还是没有下载完成,用户希望取消整个下载操作;可以设置一个停止变量,线程在现在文件期间每读取1M的数据就检查一下停止变量的值,如果停止变量值被用户设置为true,那么就直接从下载任务中退出,否则继续执行下载任务。public class ThreadTest { private static boo...原创 2019-10-19 18:36:17 · 277 阅读 · 0 评论 -
Java多线程安全
多线程能够提高CPU的使用效率,为用户提供宏观上同时执行多个动作的效果,强大的功能背后也存在线程安全性问题。多个线程同时操作共享变量导致程序输出结果与设计者的初衷不符,编程过程中可以使用以下几种方式实现线程安全。锁同步机制在多线程中很常见的问题就是生产者与消费者问题,生产者负责生产对象并且将对象放到产品队列中,消费者负责从产品队列中取出并消费对象;产品队列是一个容量大小有限制的容器,如果生产出...原创 2019-10-19 18:14:32 · 212 阅读 · 0 评论 -
Javassist分析类依赖和动态代理实现
前言Javassist作为一款强大的class编辑器,它能够读取class文件内容,class文件的常量池中包含了当前类所有需要交互的其他类。要获取当前类所有依赖的类,只需要先获取当前类直接依赖的类,再继续广度优先遍历直接依赖类依赖的类,最终遍历了整棵依赖树之后就能获取当前类依赖。对于动态代理其实也是通过在运行过程中动态新的代理类,代理类不但会增加额外的用户逻辑,还会调用被代理对象的对应方法,...原创 2018-07-05 19:18:44 · 1885 阅读 · 0 评论 -
Javassist基础使用
前言Javassist是日本人开发的一款编辑class字节码框架,可以用来检查、动态修改及创建Java类。与JDK自带的反射功能相比Javassist功能更加强大,熟练使用Javassist工具对提高Java动态编程有着重要意义。常用类ClassPool:javassist的类池,使用ClassPool 类可以跟踪和控制所操作的类,它的工作方式与 JVM 类装载器非常相似。 Ct...原创 2018-07-05 18:02:28 · 1206 阅读 · 0 评论 -
Java Class文件格式简析
前言Java开发只需要编写Java代码之后通过javac命令将其编译成.class文件,.class文件可以被JVM虚拟机加载并执行。如果需要Java能够像动态语言那样编码,通常需要修改.class文件的内容,这种情况下了解.class文件的内部结构就很有必要。类文件查看Java的class文件内容大致上包含如下的各种结构,如果某个节点有多个会被表示成数组结构,数组的长度通常都在实...原创 2018-07-04 20:40:33 · 3337 阅读 · 1 评论 -
Java死锁问题简析
前言在多线程编程中死锁是一个常见的问题,我们都知道死锁的出现有四个必要条件:资源互斥使用,也就是说每个资源一次只能有一个线程使用;占有并请求,所有的线程都持有它们目前请求到的资源并且申请还未得到的资源;不可剥夺,也就是说所有线程请求到的资源都无法被其他线程抢占;循环等待,也就是线程之间互相等待对方释放己方需要的资源。这里先通过Java代码实现简单的死锁问题,然后通过一个银行转账的示例学习如何预...原创 2018-05-31 20:44:11 · 340 阅读 · 1 评论 -
Java内存模型简析
CPU多级缓存CPU的存储速度远远高于内存的访问速度,为了匹配CPU的高速度加入了一级缓存,但是由于高速缓存很贵容量比较小,后来又增加了容量稍大的二级缓存。缓存的存在理论主要依靠程序的时间和空间局部性原理提供支持:时间局部性:如果某个数据被访问,那么在不久的将来它很可能再次被访问。空间局部性:如果某个数据被访问,那么与它相邻的数据很快也会被访问。CPU多级缓存的缓存一致性:MES...原创 2018-06-07 09:58:59 · 229 阅读 · 0 评论 -
Java NIO基础使用
前言Java中的输入输出操作主要针对数据文件和Socket对象,传统的Java IO操作都是阻塞进行的,比如在读取网络数据的时候如果数据还没有返回那么read方法就会被阻塞一直等到网络数据返回或者发生错误,再读取的时候也采用流式读取数据。在Java1.4中引入了NIO处理输入输出,NIO采用内存映射文件的方式将文件或文件的一段映射到内存中,同时它使用块IO来处理数据效率更高。缓冲区...原创 2018-06-06 18:59:07 · 2407 阅读 · 2 评论 -
JVM简单总结
前言Java虚拟机使用软件模拟Java字节码的指令集,它只是一个可以运行Java代码的假想计算机,JVM实际上运行在操作系统之上,它与硬件没有直接的交互。用户编写的Java代码通过编译器生成class文件,之后通过JVM的类加载组件加载到内存中并且存放在方法区中,用户需要创建类的实例需要根据方法区里的数据创建Class对象,生成对应的类对象,执行的代码由JVM的执行引擎转换成本地代码执行。...原创 2018-06-05 20:31:13 · 265 阅读 · 0 评论 -
Java垃圾回收机制
前言Java语言比C/C++语言更加用于友好重要的一点就是垃圾回收机制,C/C++语言在堆内存分配的资源必须开发这手动删除,如果开发者忽略了这一点就会导致内存泄漏,程序可用的内存空间越来越少,最后没有内存资源可用导致应用失败。Java的自动垃圾回收功能会始终在后台有一个垃圾回收线程,过一段时间检查内存中不再使用的垃圾内存将它们释放返回到堆内存中,这一特性将程序开发者从内存管理中解脱出来,可以将...原创 2018-06-04 10:55:33 · 239 阅读 · 0 评论 -
Java synchronized简析
前言在Java并发编程里synchronized关键字一直都有着重要的地位,在Java中任何对象都可以作为锁对象,对于普通的方法锁定的是当前实例对象,对于静态方法锁定的是当前的类对象,对于同步代码块锁定的是括号里的对象。最开始synchronized的实现是采用底层操作系统的互斥锁实现,这种锁需要在内核和用户态之间切换效率非常的低,不过在1.6版本引入了大量的优化,使得synchronized...原创 2018-06-03 19:35:42 · 166 阅读 · 0 评论 -
Java ClassLoader机制
前言类加载器将类加载到JVM中,Java的类加载采用父亲委托机制,除了根类加载器之外,其他的类加载器都会有一个父类加载。当Java程序请求加载器加载类是,加载器会首先请求它的父加载器去加载,若父加载器能够加载则由父加载器加载,否则由当前加载器进行加载,这就是JVM的父委托机制。加载过程类加载器首先从自己的命名空间中很难过查找类是否已经被加载,如果已经加载就直接返回请求类的Class...原创 2018-05-27 00:40:57 · 257 阅读 · 0 评论 -
FutureTask源码阅读
前言在学习ThreadPoolExecutor我们提到过submit提交的任务会被封装成FutureTask类型之后再放到线程池中执行,FutureTask类代表了异步执行的结果对象,用户可以使用它来获取、查看和取消异步请求。public interface Future<V> { boolean cancel(boolean mayInterruptIfRunni...原创 2018-06-03 02:16:18 · 1939 阅读 · 0 评论 -
ThreadPoolExecutor基础使用
前言Android开发中由于禁止在主线程中做网络请求,通常都需要使用线程对象来做异步请求操作,但是直接使用new Thread();创建新线程需要不停的申请系统资源,这些野生的线程缺乏统一管理,相互竞争占用过多系统资源;直接使用普通的线程做定期执行和线程中断等功能特别容易出错,为此 J.U.C类库里添加了功能强大的Executor框架,它能够为用户程序提供强大的线程池实现。使用JDK自带的线程...原创 2018-06-02 23:26:37 · 478 阅读 · 0 评论 -
Java初始化基础知识
前言Java中的初始化包括默认初始化,静态初始化块,普通初始化块和构造方法中的初始化,这些初始化代码的执行最终的结果究竟是怎么样的呢,对很多Java开发者来说还是比较困惑的,这里通过学习Java类的加载基础知识来理清它们的调用过程。类的加载和链接 阶段 注释 加载 查找并加载类的二进制数据 链接 验证:确保被加载的类的正确性;准备:为类的静态变...原创 2018-05-26 15:57:54 · 268 阅读 · 0 评论 -
Java8 lambda表达式
前言Java8发布已经有相当长的时间,其中新增加的lambda表达式支持函数式编程,实现功能的时候代码量少而且简洁,现在就开始学习lambda表达式的使用方法。函数式接口任何有函数式接口的地方,只有一个抽象方法的接口就是函数式接口,也就是说如果如果包含多个默认接口那么也是可以的,如果接口中定义了和Object一样的方法那么该方法不能作为抽象方法。public interfa...原创 2018-05-09 18:14:25 · 1081 阅读 · 0 评论