正确使用Object.wait和Object.notify

1. 前言

现在的代码实现里面几乎不用Object.wait和Object.notify了,但是对其进行学习还是有助于理解为啥他们被Locksupport.park和unpark替换了。

2. 使用汇总

关于完整使用,参考文章:如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

文章中使用wait的生产者和消费者例子可以看看。

主要要点是:

对需要线程间互斥的对象用synchronized,持有其监视器锁

永远在循环(loop)里调用 wait 和 notify, 主要避免条件不满足是就被虚假唤醒,......

聊聊Locksupport

1. 为啥有Locksuppot

看看Locksupport的源码中的注释可知,Locksupport是实现别的锁和同步类的基本原语。

Basic thread blocking primitives for creating locks and other synchronization classes.

该类native实现是依靠posix OS接口来搞的(pthread.h),类似以前操作系统课程学习的互斥锁。

class Parker : public os::PlatformParker {

private:

volatile int _counter ;

.........

关于java中的interrupt

1. interrupt知识点

PS: 以下总结基于JDK8

本文不会完整说明interrupt,只会罗列一些比较重要的点。完整了解Thread.interrupt可以看参考资料。

以下的一些理解新的有助于理解参考资料的文章:

interrupt方法调用后,针对BLOCKED状态的线程,只是设定中断标志位为true。是否响应中断(感知这个标志位的变化)取决于API的设计。JDK的阻塞IO API、Synchronized同步块、还有Lock中的很多方法(不包括lockInterruptibly)都是不响应中断的。当然调用线程可以利用标志位判断来使得自己设计的API是......

JAVA代码优化记录

1. 避免伪共享(false sharing)

1.1 概述

代码层面放的比较近的字段频繁一起并发变更可能导致需要写相同的cache line,写cache line根据MESI协议,要让别的cpu下对应的cache line保持禁写。这导致原本可以从L1 L2cache中获取的数据不得不从L3或者内存中获取,命中率大大降低,性能下降。

参考资料:http://ifeve.com/from-javaeye-false-sharing/

1.2 解决办法

避免伪共享的关键就是避免并发访问的数据在一个cache line。那么解决办法也比较简单了,需要避免伪共享的对象,加个......

使用MAT分析堆栈

1. 介绍

Eclipse MAT是eclipse提供的插件用于分析JAVA heap。试过很多分析heap的,但是没有比这个更好用的了。

PS:在mac high sierra上直接下载独立运行的MAT貌似会出问题卡死,我是本地直接下载了个。

请先阅读下MAT官方的DOC:MAT官方DOC

2. 基本概念

2.1 堆中包含的内容

All Objects:Class, fields, primitive values and references

All Classes:Classloader, name, super class, static fields......