浅谈Java网络编程(一)——非阻塞I/O

2020-01-30
阅读 6 分钟
2.2k
Unix中I/O的基本组成元素是字节序列。大多数程序应用于字节流或I/O流。进程通过描述符引用I/O流,也被称作文件描述符。管道、文件、POSIX IPC's(消息队列,信号量,共享内存),事件队列等都是通过文件描述符引用I/O流。

浅谈Java性能优化(二)——String intern原理

2020-01-23
阅读 3 分钟
5.2k
简单来说,在Java8中,String类维护了一个字符串常量池(注意此常量池在运行期间位于堆中),当调用intern方法时,首先在常量池中查看是否已有相同的字符串(字符串是否相同使用String的equal方法判断),如果常量池中已有,则直接返回该字符串的引用,如果没有,则将当前字符串对象加入常量池中,并返回当前字符串的引用。

浅谈Java并发编程系列(九)—— AQS结构及原理分析

2017-02-24
阅读 10 分钟
23.9k
AQS,即AbstractQueuedSynchronizer, 队列同步器,它是Java并发用来构建锁和其他同步组件的基础框架。来看下同步组件对AQS的使用:

浅谈Java并发编程系列(八)—— LockSupport原理剖析

2017-02-21
阅读 5 分钟
27.1k
LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport 提供park()和unpark()方法实现阻塞线程和解除线程阻塞,LockSupport和每个使用它的线程都与一个许可(permit)关联。permit相当于1,0的开关,默认是0,调用一次unpark就加1变成1,调用一次park会消费permit, 也就是将1变成0,同时park立即返回。再次...

浅谈Java并发编程系列(七) —— 深入解析synchronized关键字

2016-09-26
阅读 2 分钟
3.4k
java中的每一个对象都至少包含2个字(24 Bytes for 32bits & 28 Bytes for 64bits, 不包括已压缩的对象)。第一个字被称为Mark Word。这是一个对象的头,它包含了不同的信息,包括锁的相关信息。第二个字是指向metadata class的指针,metadata class字义了对象的类型。这部分也包含了VMT(Virtual Method Table)。

浅谈Java并发编程系列(六) —— 线程池的使用

2016-09-24
阅读 7 分钟
3.3k
线程池的作用 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的资源浪费。 提高响应速度。当任务到达时,不需要等到线程创建就能立即执行。 方便管理线程。线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以对线程进行统一的分配,优化及监控。 设置线程池...

浅谈Java并发编程系列(五)—— ReentrantLock VS synchronized

2016-09-23
阅读 3 分钟
7.7k
ReentrantLock是Java并发包中一个非常有用的组件,一些并发集合类也是用ReentrantLock实现,包括ConcurrentHashMap。ReentrantLock具有三个特性:等待可中断、可实现公平锁、以及锁可以绑定多个条件。

浅谈Java并发编程系列(四)—— 原子性、可见性与有序性

2016-09-22
阅读 1 分钟
5k
原子性(atomicity): 由Java内存模型来直接保证原子性变量操作包括read, load, assign, use, store和write。大致可以认为基本数据类型的访问读写是具有原子性的。如果应用场景需要一个更大范围的原子性保证,Java内存模型还提供了lock和unlock操作来满足需求,尽管虚拟机没有把lock和unlock操作直接开放给用户使用,但...

浅谈Java并发编程系列(三)—— volatile型变量

2016-09-22
阅读 2 分钟
3.2k
当一个变量定义为volatile之后,它具备两种特性: 保证此变量对所有线程的可见性,这里的“可见性”是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。 禁止指令重排序优化。 在X86处理器下通过工具获取 JIT编译器生成的汇编指令来看下volatile变量进行读写操作时CPU的行为:Java 代码如下: {代...

浅谈Java并发编程系列(二)—— Java内存模型

2016-09-21
阅读 2 分钟
4.2k
在介绍Java内存模型之前,先简单了解下物理计算机中的并发问题。由于处理器的与存储设置的运算速度有几个数量级的差距,所以现代计算机加入一层读写速度尽可能接近处理器的高速缓存来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存中,这样处理器...

浅谈Java并发编程系列(一)—— 如何保证线程安全

2016-09-21
阅读 1 分钟
7.5k
通过上层的架构设计和业务分析来避免并发场景。比如需要用多线程或分布式集群统计一堆用户的相关统计值,由于用户的统计值是共享数据,因此需要保证线程安全。从业务上分析出用户之间的数据并不共享,因此可以设计一个规则来保证一个用户的计算工作和数据访问只被一个线程或一台机器完成,这样从设计上避免了接下来可能...

浅谈Java性能优化(一)——Java对象内存占用分析

2016-09-18
阅读 19 分钟
17.4k
本文深入分析并验证了不同Java对象占用内存空间大小的情况。对于不同的jvm实现,Java对象占用的内存空间大小可能不尽相同,本文主要分析HotSpot jvm中的情况,实验环境为64位window10系统、JDK1.8,使用JProfiler进行结论验证。