Java并发之线程安全
编写线程安全的代码,核心在于对状态访问操作进行管理,特别是共享的和可变的状态的访问。
- 共享意味着变量可以由多个线程进行访问;
- 可变意味着变量的值在其生命周期内可变化
当有多个线程访问同一个可变的状态变量时,没有使用合适的同步,那么程序就会出现错误,有3种方法可以修复这个问题:
- 不在线程之间共享状态变量
- 将状态变量修改为不可变的变量
- 在访问状态变量时使用同步
编写线程安全的代码,核心在于对状态访问操作进行管理,特别是共享的和可变的状态的访问。
当有多个线程访问同一个可变的状态变量时,没有使用合适的同步,那么程序就会出现错误,有3种方法可以修复这个问题:
本文介绍基于数组的常用排序算法.
数组是使用最广泛的基础数据结构。数组是存放在连续内存空间上的相同类型数据的集合,可以方便的通过数字索引的方式获取到索引所对应的数据。需要注意的是数组的索引都是从0开始计算的。下图就是长度为3的字符数组的例子。
| 内存地址 | 1001 | 1002 | 1003 |
|---|---|---|---|
| 数组元素 | ‘a’ | ‘b’ | ‘c’ |
| 数组索引 | 0 | 1 | 2 |
假设一个数组,其元素按照值的固定顺序排序(升序或降序),那么这种数组被称为有序数组。在实际的算法使用中常常会对数组先进行排序,然后在进行处理。
本文是数据结构的相关简介。
什么是算法?从一个步骤开始,按照既定的顺序执行完所有的步骤,最终结束得到结果的一个过程。
程序 = 算法+ 数据结构.
将问题抽象为数学模型,输入输出方法和算法步骤是编写计算机算法程序的三大关键要素。对于非常复杂的问题,建立数学模型是很困难的事情,但是对简单的计算机算法而言,建立数学模型实际上就是设计合适的数据结构的问题,同时,输入输出方式和算法步骤的设计都是基于相应的数据结构设计的。
前面我们介绍了Java的类加载流程。这篇文章,我们来详细了解下java的类加载器。
在java代码中,类型的加载,连接与初始化过程都是在程序运行期间完成的(类class文件信息在编译期间已经确定好)。

类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载Loading、验证Verification、准备Preparation、解析Resolution、初始化Initialization、使用Using和卸载Unloading7个阶段。其中准备、验证、解析3个部分统称为连接Linking。
加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,而解析阶段则不一定:它在某些情况下可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定(也称为动态绑定或晚期绑定)。
注意,本文的JDK版本是Java 1.8,在Java 9 引进模块化后,ClassLoader也有了一些新变化。
多任务处理在现代计算机操作系统中是一个必备功能。计算机的运算能力变得十分强大的同时,运算速度与存储和通信子系统速度的差距太大,大量的时间都花费在磁盘I/O、网络通信和数据库访问上,因此为了避免处理器的大部分时间都花费在等待其它资源,一种行之有效的方法是让计算机同时处理多项任务。
HotSpot虚拟机实现GC算法时,必须对算法的执行效率有严格的考量,才能保证虚拟机的高效运行。本文介绍了HotSpotGC 算法的部分内部实现。
浮点数是计算机科学中一种对于实数的近似数值表示法,由一个有效数字(尾数)加上幂数来表示,即二进制的科学计数法。IEEE 协会为了规范统一(方便CPU指令制造,各平台兼容等等)出台了 IEEE Standard for Floating-Point Arithmetic(IEEE-754)二进制浮点数算数标准,选用了浮点数作为储存和算数标准。 该标准描述了包括"浮点数的格式"、“一些特殊数值”、“浮点数的运算”、“舍入规则与例外情况” 等等内容。