Java并发之Thread
线程有时也被称为轻量级的进程。进程和线程都提供了一个执行环境,但创建一个新的线程比创建一个新的进程需要的资源要少。 线程是在进程中存在的,每个进程最少有一个线程。线程共享进程的资源,包括内存和打开的文件。这样提高了效率,但潜在的问题就是线程间的通信。
线程有时也被称为轻量级的进程。进程和线程都提供了一个执行环境,但创建一个新的线程比创建一个新的进程需要的资源要少。 线程是在进程中存在的,每个进程最少有一个线程。线程共享进程的资源,包括内存和打开的文件。这样提高了效率,但潜在的问题就是线程间的通信。
开始比较前,先来了解下循环和递归的定义。
注意: 上面的循环定义不适用于所有情况,在一些函数编程语言(例如Haskell和Scheme)中会使用递归或不动点组合子来达到循环的效果。
在前面的Java虚拟机-内存布局一文中我们简单介绍了虚拟机栈:
本文将继续详细介绍虚拟机栈。
在HotSpot JVM(jvm 8以前)中,永久代中用于存放类和方法的元数据以及常量池,在Java中对应能通过反射获取到的数据,比如Class和Method。每当一个类初次被加载的时候,它的元数据都会放到永久代中。永久代是有大小限制的(启动时设置),因此如果加载的类太多,很有可能导致永久代内存溢出(java.lang.OutOfMemoryError: PermGen)。Java 8为了解决这一问题,彻底将永久代移除出了HotSpot JVM,将其原有的数据迁移至Java Heap或Metaspace1。
因为堆是全局共享的,因此在同一时间,可能有多个线程在堆上申请空间,那么,在并发场景中,如果两个线程先后把对象引用指向了同一个内存区域,那么对象的内存分配过程就必须进行同步控制。无论是使用哪种同步方案,都会影响内存的分配效率。
而Java对象的分配是Java中的高频操作,所有,人们想到另外一个办法(TLAB)来提升效率。
本文介绍和深入分析 Java 中 String 类的 intern 方法。
本文介绍 Java 虚拟机的内存布局。
OOM(OutOfMemoryError)是java工程师都会了解的一种异常,实质上,OOM并不是只有一种,一共有9种不同类型的OOM:
不同的原因触发不同类型的OOM,每种OOM类型的解决方案也不同。
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
假设我们正在编写一个剪刀-布-石头游戏。我们可以使用三个任意整数(例如,0,1,2或88,128,168),三个字符串(“剪刀”,“布”,“石头”)来表示三个手势。主要缺点是我们需要检查程序中其他不可行的值(例如 3、“Rock"等)以确保正确性。
枚举是一种特殊类型,它为程序中的常量提供类型安全的实现。换句话说,我们可以声明一个类型的变量,它只接受预先定义的值。