随笔分类 - J.U.C
摘要:在JDK1.5之前,也就是J.U.C加入JDK之前,Java是依靠synchronized关键字(JVM底层提供)来维护协调对共享字段的访问,保证对这些变量的独占访问权,并且以后其他线程忽的该锁时,将可以看到对这些变量进行的更改(可见性,互斥性)。 锁机制的问题: 锁问题不可回避的,就是上下文...
阅读全文
摘要:前面已经介绍硬件平台Cache Coherence问题和解决办法,下面来看看Java虚拟机平台的相关知识。硬件平台处理器,高速缓存,主存之间的交互关系如下:Java内存模型(JMM) Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model, JMM)来屏蔽掉底...
阅读全文
摘要:缓存(Cache) CPU的读/写(以及取指令)单元正常情况下甚至都不能直接访问内存——这是物理结构决定的;CPU都没有管脚直接连到内存。相反,CPU和一级缓存(L1 Cache)通讯,而一级缓存才能和内存通讯。大约二十年前,一级缓存可以直接和内存传输数据。如今,更多级别的缓存加入到设计中,一级...
阅读全文
摘要:pipeline: 现在的CPU一般采用流水线方式来执行指令。一个指令执行周期被分成:取值,译码,执行,访存,写会,更新PC若干阶段。然后,多条指令可以同时存在于流水线中,同时被执行,来提高系统的吞吐量。 流水线并不是串行的,并不会因为一个耗时很长的执行在"执行"阶段呆很长时间,而导致后续的...
阅读全文
摘要:这里看一下原子数组操作和一些其他的原子操作。 AtomicIntegerArray/AtomicLongArray/AtomicReferenceArray的API类似,选择代表性的AtomicIntegerArray来描述这些问题。 int get(int i) //获得当前位置的值void...
阅读全文
摘要:很多情况下我们只是需要简单的,高效,线程安全的递增递减方法。注意,这里有三个条件:简单,意味着程序员尽可能少的底层或者实现起来比较简单;高效,意味着耗用资源要少,程序处理速度要快; 线程安全也非常重要,这个在多线程下能保证数据的正确性。这三个条件看起来比较简单,但是实现起来却难以令人满意。 ...
阅读全文
摘要:通过直接继承Thread, 实现Runnable接口来创建线程。但这两种方式都有一种缺陷:在执行完任务之后无法获得执行结果。 如果需要获得执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来比较麻烦,而jdk中Callable和Future,通过他们可以在任务执行完毕...
阅读全文
摘要:Java里面线程池顶级接口是Executor,但严格意义上讲Executor并不是一个线程池,而是一个线程执行工具,真正的线程池接口是ExecutorService.关系类图如下: 首先Executor的execute方法只是执行一个Runnable任务而已,当然从某种角度上讲最后的实现类...
阅读全文

浙公网安备 33010602011771号