1 ByteBuffer使用总结
最近涉及到UDP通信协议,需要发送UDP数据包,需要组织字节数组。想到StringBuffer,就想字节是否也有类似的缓冲类呢?网上查找之后找到了ByteBuffer类,使用了DirectByteBuffer,组织字节数据很容易。却在不了解这个类实现原理的情况下用了,然后出错了。由于项目时间很赶,就自己简单实现了一个同名的类,封装了put和get方法。还没及时看看当时调用出错的原因。
这两天仔细看了ByteBuffer类结构,深入了解了下这个类。才知道使用DirectByteBuffer容易导致OutOfMemoryError.因为这个类分配的内存空间是直接使用本地内存的,而且只有在堆内存空间不足触发FullGC时才会回收DirectByteBuffer占用的本地内存的。通常情况下如果堆空间足够,在没有FullGC的情况下,使用DirectByteBuffer会导致内存泄漏。
ByteBuffer的两种实现HeapByteByffer和DirectByteBuffer。HeapByteBuffer是堆内存,由GC管理。DirectByteBuffer则是绕过了JVM,经过底层的JNI,直接分配的是本地内存,可以避免缓冲区复制。
结论:想要更好的使用一个类,还是需要先了解这个类的本质,不能想当然。
2 并发编程实践读书笔记
最近在阅读并发编程实践,摘录文中比较重要的几个概念如下。
1)并发环境需要考虑同步的情况:涉及到对共享可变状态变量的访问时,必须对线程执行操作进行管理。
2)竞态条件:多线程环境中,由于不恰当的执行时序而导致不正确的结果的情况。
3)加锁:用锁来保护共享状态可变变量时,同一个类的所有状态可变的变量,他们都应该由同一个锁保护。所有线程对共享变量的修改都必须在同一个锁上同步。
4)voliatle:一种弱同步机制,有两种语义。第一,禁止指令重排序;第二,将变量的更新操作通知到其它线程。