java
文章平均质量分 94
爬蜥
这个作者很懒,什么都没留下…
展开
-
java nio中的select和channel是怎么使用的?
什么是NIO?线程在处理数据时,如果线程还处于将数据从channel读到buffer的这段时间内,线程可以去做别的事情,等数据都读到buffer了,线程再回来处理读到的数据channel是什么?类比流的概念。与流的区别在于channel是可读可写的,但是一个流要么写要么读chanel可以异步的读和写数据总是从channel中读到buffer,或者从buffer中写到cha...原创 2018-07-08 22:30:48 · 748 阅读 · 0 评论 -
从wait的源码看撤销偏向锁的过程(revoke and rebias)
wait源码实现如下//TRAPS表示是否有异常void ObjectSynchronizer::wait(Handle obj, jlong millis, TRAPS) { if (UseBiasedLocking) { //如果是使用了偏向锁,要撤销偏向锁 BiasedLocking::revoke_and_rebias(obj, false, THREAD); ...原创 2018-12-18 00:06:46 · 1378 阅读 · 0 评论 -
偏向锁状态转移原理
为什么需要偏向锁当多个处理器同时处理的时候,通常需要处理互斥的问题。一般的解决方式都会包含acquire和release这个两种操作,操作保证,一个线程在acquire执行之后,在它执行release之前,其它线程不能完成acquire操作。这个过程经常就涉及到锁。研究表明(L. Lamport A fast mutual execlusion algorithm),通过 fast locks...翻译 2018-12-18 00:01:23 · 304 阅读 · 0 评论 -
safe-point(safepoint 安全点) 和 safe-region(安全区域)
以 GC safe-point引入GC如何找到不可用的对象编写代码的时候是可以知道对象不可用的,但对于程序来说,需要一定的方式来知晓,可用方法比如:编译分析,引用计数,和对象是否可达可达性分析一个对象只要能够通过mutator触达,那么它就是“活”着的。如果Mutator栈的一个槽位包含了对象的引用,那么对象就是直接可触达。而从直接可达对象可触达的对象必定也是可达的,因而可达性分析,只...翻译 2018-12-17 23:54:55 · 1956 阅读 · 0 评论 -
LockSupport中的park与unpark原理
LockSupport是用来创建locks的基本线程阻塞基元,比如AQS中实现线程挂起的方法,就是park,对应唤醒就是unpark。JDK中有使用的如下LockSupport提供的是一个许可,如果存在许可,线程在调用park的时候,会立马返回,此时许可也会被消费掉,如果没有许可,则会阻塞。调用unpark的时候,如果许可本身不可用,则会使得许可可用许可只有一个,不可累加park源码跟...原创 2018-12-17 23:54:13 · 36508 阅读 · 8 评论 -
CAS(compareAndSwap)原理
unsafe中对应拥有三个方法 compareAndSwapObject ,compareAndSwapInt和compareAndSwapLong ,他们都被标记为nativecompareAndSwapObject它的核心实现为oop res = oopDesc::atomic_compare_exchange_oop(x, addr, e);实现核心如下inline oop oo...原创 2018-12-17 23:44:04 · 241 阅读 · 0 评论 -
Java中的显示锁ReentrantLock使用与原理
考虑一个场景,轮流打印0-100以内的技术和偶数。通过使用 synchronize 的 wait,notify机制就可以实现,核心思路如下:使用两个线程,一个打印奇数,一个打印偶数。这两个线程会共享一个数据,数据每次自增,当打印奇数的线程发现当前要打印的数字不是奇数时,执行等待,否则打印奇数,并将数字自增1,对于打印偶数的线程也是如此//打印奇数的线程private static class...原创 2018-11-25 16:20:09 · 508 阅读 · 0 评论 -
java synchronize - 线程同步机制
Java支持同步机制的是Monitor。Monitor就像是拥有一个特殊房间的建筑,在同一时间里,这间特殊的房间只能被一个线程拥有。enter the monitor:进入这幢建筑acquiring the monitor:进入建筑里的特殊房间owning the monitor:拥有特殊房间的所有权releasing the monitor:离开特殊的房间exiting the mo...原创 2018-11-25 16:08:51 · 839 阅读 · 0 评论 -
Java中常见死锁与活锁的实例
顺序死锁:过度加锁,导致由于执行顺序的原因,互相持有对方正在等待的锁资源死锁:多个线程在相同的资源上发生等待由于调用顺序而产生的死锁public class Test { Object leftLock = new Object(); Object rightLock = new Object(); public static void main(String[]...原创 2018-11-25 16:02:08 · 2527 阅读 · 2 评论 -
java中线程池的生命周期与线程中断
线程池生命周期包括:RUNNING:接收新的任务并处理队列中的任务SHUTDOWN:不接收新的任务,但是处理队列中的任务STOP:不接收新的任务,不处理队列中的任务,同时中断处理中的任务TIDYING:所有的任务处理完成,有效的线程数是0TERMINATED:terminated()方法执行完毕转换成TIDYING状态的线程会运行terminated方法。执行完terminate...原创 2018-11-25 15:53:42 · 1060 阅读 · 0 评论 -
java中的Executors简介与多线程在网站上逐步优化的运用案例
提供Executor的工厂类忽略了自定义的ThreadFactory、callable和unconfigurable相关的方法newFixedxxx:在任意时刻,最多有nThreads个线程在处理task;如果所有线程都在运行时来了新的任务,它会被扔入队列;如果有线程在执行期间因某种原因终止了运行,如果需要执行后续任务,新的线程将取代它 return new ThreadPoo...原创 2018-11-25 15:38:29 · 183 阅读 · 0 评论 -
java 对线程安全支持有哪些?
同步容器。它的原理是将状态封装起来,并对每个公有方法都实行同步,使得每次只有1个线程能够访问容器的状态。Vector和HashTableCollections.synchronizedXXX方法同步容器的问题这种方式使得对容器的访问都串行化,严重降低了并发性,如果多个线程来竞争容器的锁时,吞吐量严重降低对容器的多个方法的复合操作,是线程不安全的,比如一个线程负责删除,另一个线...原创 2018-11-25 15:05:52 · 284 阅读 · 0 评论 -
什么时候线程不安全?怎样做到线程安全?怎么扩展线程安全的类?
当多个线程去访问某个类时,如果类会表现出我们预期出现的行为,那么可以称这个类是线程安全的。什么时候会出现线程不安全?操作并非原子。多个线程执行某段代码,如果这段代码产生的结果受不同线程之间的执行时序影响,而产生非预期的结果,即发生了竞态条件,就会出现线程不安全;常见场景:count++。它本身包含三个操作,读取、修改、写入,多线程时,由于线程执行的时序不同,有可能导致两个线程执行后...原创 2018-11-25 11:25:12 · 655 阅读 · 0 评论 -
Java并发编程之旅总览
线程安全的概念什么时候线程不安全?怎样做到线程安全?怎么扩展线程安全的类?java对线程安全的支持java 对线程安全支持有哪些?java 中的线程池Executors的使用与ThreadPoolExecutorjava中线程池的生命周期与线程中断java 中的锁Java中常见死锁与活锁的实例synchronize - 线程同步机制显示锁ReentrantLock使用...原创 2018-11-25 17:10:26 · 115 阅读 · 0 评论 -
AbstractQueuedSynchronizer原理剖析
无论是公平锁还是非公平锁,它们的实现都依赖于AbstractQueuedSynchronizer,它提供了一个基于先进先出等待队列 实现block locks和synchronizers的框架。特性如下仅通过一个 int 类型来代表状态。对于ReentrantLock而言,他就是线程持有锁的次数,当次数为0时,代表锁没有被持有,正数代表被持有的次数,负数则是超出了锁的持有范围,有可能存在死循环...原创 2018-11-25 16:33:43 · 592 阅读 · 0 评论 -
从java的NIO版hello world看java源码,我们能看到什么?
Java NIO服务端代码的hello world怎么写?public class NBTimeServer { public static void main(String[] args) { try { Selector acceptSelector = SelectorProvider.provider().openSelector...原创 2018-07-15 18:02:33 · 334 阅读 · 1 评论 -
如何读open jdk native 源码
怎么看open jdk native的源码类的命名与java类的命名是一模一样的方法的命名为JNI的代码风格一般关注下文件头,如果是系统文件,比如 JVM_ENTRY等类似这样的字符是啥意思?JVM_ENTRY本身是一个宏定义,位于interfaceSupport.hpp中#define JVM_ENTRY(result_type, header) ...原创 2018-07-15 17:50:06 · 1014 阅读 · 0 评论 -
java JNI简介
JNI的接口函数和指针native代码想要访问 java虚拟机需要调用JNI方法,而获取JNI方法则通过 JNI interface Pointer。它实际指向的就是一个都是指针的数组,每个指针指向的都是一个接口函数这样做的优势: * JNI 命名和native code书写分开,避免硬编码 JNI interface Pointer 只在当前线程有效,即native 方法不...翻译 2018-07-15 17:45:31 · 2698 阅读 · 0 评论 -
java之旅总览
java并发之旅Java并发编程之旅总览IOjava nio中的select和channel是怎么使用的?一文告诉你java NIO底层用到的那些connect、bind、listen、accept、close从java的NIO版hello world看java源码,我们能看到什么?JNIjava JNI简介open jdk源码阅读如何读open jdk native 源码中...原创 2019-01-01 00:37:07 · 208 阅读 · 0 评论