AsmTools 在 OpenJDK 里有一个 AsmTools 项目,用来生成正确的或者不正确的 Java .class 文件,主要用来测试和验证。我们知道直接修改.class文件是很麻烦的,虽然有一些图形界面的工具,但还是很麻烦。 AsmTools 引入了两种表示 .class 文件的语法: JASM 用类似 Java 本身的语法来定义类和函数,字节码指令则很像传统的汇编。 java -jar asmtools.jar jdis Test.class JCOD 整个 .class 用容器的方式来表示,可以很清楚表示类文件的结构。 java -jar asmtools.jar jdec Test.class AsmTools修改字节码 Java源码文件 public class Foo { public static void main(String[] args) { boolean flag = true; if (flag) System.out.println("Hello, Java!"); if (flag == true) System.out.prin....
编译执行 直接将代码编译成 CPU 所能理解的代码格式,机器码。 比如下图的中间列,就是用 C 语言写的 Helloworld 程序的编译结果。可以看到,C 程序编译而成的机器码就是一个个的字节,它们是给机器读的。那么为了让开发人员也能够理解,我们可以用反汇编器将其转换成汇编代码(如下图的最右列所示)。 ; 最左列是偏移;中间列是给机器读的机器码;最右列是给人读的汇编代码 0x00: 55 push rbp 0x01: 48 89 e5 mov rbp,rsp 0x04: 48 83 ec 10 sub rsp,0x10 0x08: 48 8d 3d 3b 00 00 00 lea rdi,[rip+0x3b] ; 加载 "Hello, World!\n" 0x0f: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x0 0x16: b0 00 mov al,0x0 0x18: e8 0d 00 00 00 call 0x12 ; 调用 printf 方法 0x1d: 31 c9 xor ecx,ecx 0x1f: 89 45 f8 mo....
什么是控制并发流程? 控制并发流程的工具类,作用就是帮助开发者更容易得让线程之间合作。 让线程之间相互配合,来满足业务逻辑(按照预想的方式并发执行)。 比如:让线程 A 等待线程 B 执行完毕再执行等合作策略。 控制并发流程工具类纵览 CountDownLatch 直译 倒数门栓,类似于过山车,人满才会发车。 执行流程如下: 1. 线程开始运行 2. 进入等待,倒数结束之前,一直处于`等待`状态 3. 等待的过程中进行倒数(减) 4. 倒数结束,线程`继续`工作。 CountDownLatch 主要方法概览 * CountDownLatch(int count):仅有一个构造函数,参数 count 为需要倒数的数值。 * await():调用 await() 方法的线程会被挂起,它会等待直到 count 值为 0 才继续执行。 * countDown():将 count 值减1,直到为0时,等待的线程会被唤醒。 CountDownLatch 用法 * 一个线程等待多个线程都执行完毕,再继续自己的工作。 一等多 * 多个线程等待某个线程的信号,同时开始执行。 多等一 *....
Vector、Hashtable Vector 特点 类似一个线程安全的 ArrayList * 大量容器操作方法都采用同步方法 Vector<String> vector = new Vector<>(); vector.add("test"); System.out.println(vector.get(0)); Hashtable 特点 类似一个线程安全的 HashMap * 大量容器操作方法都采用同步方法 Hashtable<String, String> hashtable = new Hashtable<>(); hashtable.put("a", "80%"); System.out.println(hashtable.get("a")); Collections.synchronizedXXX() 虽然这两个类不是线程安全的,但是可以用 Collections.synchronizedList(new ArrayList<Integer>())、Conllections.synchroniz....
发展史 1989 年 C 被称为 ANSI C,也被称为 C89。 1990 年被 ISO 采纳为国际标准,称为 ISO C。也被称为C90。 ANSI C == C89 == C90 美国国家标准学会( American National Standards Institute) 国际标准化组织(International Standardization Organization) 特点 语言简洁、紧凑,使用方便灵活; 运算符丰富; 数据类型丰富,具有现代语言的各种数据结构; 具有结构化的控制语句; 语法限制不太严格,程序设计自由度大; C 语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作; 生成目标代码质量高,程序执行效率高; 用 C 语言编写的程序可移植性好(与汇编语言比)。 编译环境准 Linux * gcc Windows * gcc (MinGW) 安装步骤 下载 安装过程省略… 配置用户环境变量 * 将 E:\Tools\MinGW\bin 加入 PATH * 将 E:\Tools\MinGW\in....
不变性(Immutable) 如果对象在被创建后,状态就不能被修改,那么它就是不可变的。 具有不变性的对象一定是线程安全的,我们不需要对其采取任何二外的安全措施,也能保证线程安全。 示例:person 对象,age、name 都不能再变。 /** * 描述: 不可变的对象,演示其他类无法修改这个对象,public也不行 */ public class Person { final int age = 18; String alice = new String("Alice");//这样就破坏了不可变性 final String name = alice; final TestFinal testFinal = new TestFinal(); public static void main(String[] args) { Person person = new Person(); person.alice = "44"; System.out.println(person.name); } } final 的作用 类防止被继承,方法防止被重写,变量防止被修改 天生是线程安全的....
CAS 简介 compare and swap 一种思想、一种用来实现线程安全的算法。 同时也是一种 CPU 指令: compare and swap(比较和交换),一种不会被打断的操作组合。 实现思路 我认为V的值应该是A,如果是的话我就把它修改成B,如果不是A(说明被别人修改过),那我就不修改了,避免多人同时修改导致出错。 CAS 有三个操作数:内存值V、预期值A、要修改的值B,当且仅当预期值 A 和内存值 V 相同时,才将内存值修改为 B,否则什么都不做。最后返回现在的值。 * CPU 的特殊指令保证了原子性 CAS 等价代码(Java) /** * 描述: Java 代码 模拟CAS操作,等价代码 */ public class SimulatedCAS { private volatile int value; //整个方法作用相当于 CPU 的一条指令(CAS 指令) public synchronized int compareAndSwap(int expectedValue, int newValue) { int oldValue = value; i....