Java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作。
Unsafe提供了主要提供了3个功能:
- 通过Unsafe分配内存,释放内存;
- 定位对象字段的内存位置,通过内存位置修改对象的字段值;
- 挂起线程与恢复线程;
- CAS操作
Enjoy coding
Java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作。
Unsafe提供了主要提供了3个功能:
Lock常用于处理线程同步,解决并发操作,然而,Lock也可以用来实现线程间通信。但是,Lock并不能直接进行线程通信,而是要借助Condition。
根据Condition接口的定义,Condition提供了await、signal、signalAll等几个方法,分别对标Object对象的wait、notify、notifyAll方法。
Object对象的wait等方法,需要使用在synchronized方法或者代码块中,也即在调用这些方法前,需要获取到锁对象;同样,Condition对象的await等方法,也是首先需要获取到锁,只是获取锁的方式有所不同,使用的是Lock锁。
Java 锁对象 ReentrantLock,用于处理线程同步,和synchronized方法或者代码块类似,获取到锁对象的线程,将独享代码块,其它线程不能访问;
ReentrantLock实现了Lock接口(提供了lock,unlock,newCondition等方法),实际是真正处理加锁,释放锁的是它的内部类Sync,而Sync又继承自 AbstractQueuedSynchronizer;
AbstractQueuedSynchronizer 中的 Node 节点,等待队列中的单个节点对象;
线程的同步是为了防止多个线程访问一个数据对象时,对数据造成破坏。在多个线程同时访问互斥(可交换)数据时,应该同步以保护数据,确保两个线程不会同时修改更改它。
Java中线程执行步骤:
Collection的子类,除了List和Map外,还有一类集合Queue,它是在两端出入的List,所以也可以用数组或链表来实现。队列可分为两类,普通队列和线程安全队列。普通队列包含LinkedList,ArrayDeque。
线程安全队列又分为无界队列和有界队列,有界队列常用于类似于生产者消费者的需求。
Promise 对象可以理解为一次执行的异步操作,使用 promise 对象之后可以使用一种链式调用的方式来组织代码。比如使用 ajax 发一个A请求后,成功后拿到数据,我们需要把数据传给B请求,传统的写法会有多个嵌套一层层写下去,或者把第二个请求提取成另外一个方法,但这样增加了阅读成本,并不能一眼看出这两个请求是流程化两个连续请求;