摘要:1 为何要适用线程池 首先我们知道线程对于操作系统来说是一种 珍贵的资源 ,像我们如果每次使用到的时候手动创建,线程执行完 方法后又自动关闭,下次用的时候还得手动创建,这样无论对于操作系统还是我们来说都是一种 时间 和 资源 的浪费,所以我们可以选择维护一些线程,这些线程在执行完任务之后继续执行其他 阅读全文
posted @ 2019-12-02 22:58 张小云的博客 阅读 (259) 评论 (0) 编辑
摘要:1 先谈Finalize() finalize()能做的所有工作,使用try-finally或者其他方式都可以做得更好、更及时,所以笔者建议大家完全可以忘掉Java语言中有这个方法的存在。 ——《深入理解JVM》 finalize()方法确实可以实现一次对象的自救,但是其不确定性和昂贵的运行代价都表 阅读全文
posted @ 2019-11-08 22:41 张小云的博客 阅读 (143) 评论 (0) 编辑
摘要:1、Dead Or Alive 我们都知道对象死亡的时候需要进行垃圾回收来回收这些对象从而释放空间,那么什么样的对象算是死亡呢,有哪些方法可以找出内存中的死亡对象呢?一般来说,我们可以这样认为:如果内存中不存在对当前对象的引用,则此对象一定是死亡状态;但是死亡状态的对象并不一定没有其他对象进行引用( 阅读全文
posted @ 2019-11-05 23:18 张小云的博客 阅读 (155) 评论 (4) 编辑
摘要:线程封闭 在多线程的环境中,我们经常使用锁来保证线程的安全,但是对于每个线程都要用的资源使用锁的话那么程序执行的效率就会受到影响,这个时候可以把这些资源变成线程封闭的形式。 1、栈封闭 所谓的栈封闭其实就是使用局部变量存放资源,我们知道局部变量在内存中是存放在虚拟机栈中,而栈又是每个线程私有独立的, 阅读全文
posted @ 2019-10-22 22:29 张小云的博客 阅读 (190) 评论 (0) 编辑
摘要:1、线程状态及切换 Java中的线程有六种状态,使用线程Thread内的枚举类来实现,如下,我对每个状态都进行了一定的解释。 public enum State { /** 表示一个线程还没启用(即未调用start方法)*/ NEW, /** * JVM中执行的线程都是处于这个状态的,但是处于这个状 阅读全文
posted @ 2019-10-17 23:37 张小云的博客 阅读 (395) 评论 (0) 编辑
摘要:一、指令重排序 指令重排序分为三种,分别为编译器优化重排序、指令级并行重排序、内存系统重排序。如图所示,后面两种为处理器级别(即为硬件层面)。 编译器优化重排序:编译器在不改变程序执行结果的情况下,为了提升效率,对指令进行乱序的编译。例如在代码中A操作需要获取其他资源而进入等待的状态,而A操作后面的 阅读全文
posted @ 2019-10-15 21:43 张小云的博客 阅读 (217) 评论 (0) 编辑
摘要:本文的内存模型只写虚拟机内存模型,物理机的不予描述。 一、Java的运行时区域 在Java中,虚拟机将运行时区域分成6种,如图: 程序计数器:用来记录当前线程执行到哪一步操作。在多线程轮换的模式中,当当前线程时间片用完的时候记录当前操作到哪一步,重新获得时间片时根据此记录来恢复之前的操作。 虚拟机栈 阅读全文
posted @ 2019-10-09 23:24 张小云的博客 阅读 (238) 评论 (0) 编辑
摘要:1、在分布式系统中,我们使用锁机制只能保证同一个JVM中一次只有一个线程访问,但是在分布式的系统中锁就不起作用了,这时候就要用到分布式锁(有多种,这里指 redis) 2、在 redis当中可以使用命令 setnx(key, value)来实现分布式锁 setnx:当key不存在的时候设置成功,返回 阅读全文
posted @ 2019-09-10 10:32 张小云的博客 阅读 (86) 评论 (0) 编辑