- 浏览: 249355 次
- 性别:
- 来自: 北京
博客专栏
-
Java并发包源码解析
浏览量:98099
最新评论
-
746238836:
整个RingBuffer内部做了大量的缓存行填充,前后各填充了 ...
disruptor-3.3.2源码解析(2)-队列 -
xiangshouxiyang:
群加不了。。。
Jdk1.7 ForkJoin框架源码解析汇总 -
有贝无患:
acquire方法里面为什么tryAcquire会被调用多次 ...
Jdk1.6 JUC源码解析(6)-locks-AbstractQueuedSynchronizer -
zwy_qz:
library_call.cpp 里面的内联操作 inline ...
Jdk1.6 JUC源码解析(1)-atomic-AtomicXXX -
sunwang810812:
您好,正在学习您的文章,中间有一段,一直没明白:“privat ...
Jdk1.6 JUC源码解析(6)-locks-AbstractQueuedSynchronizer
文章列表
Jdk1.6 JUC源码解析(4)-atomic-AtomicStampedReference、AtomicMarkableReference
作者:大飞
功能简介:
为了避免CAS过程中的ABA问题,并发包提供了两个类,AtomicStampedReference和AtomicMarkableReference。前者相当于一个[引用,integer]的二元组,后者相当于一个[引用,boolean]的二元组。
AtomicStampedReference可用来作为带版本号的原子引用,而AtomicMarkableReference可用于表示如:已删除的节点。
...
Jdk1.6 JUC源码解析(3)-atomic-AtomicXXXFieldUpdater
作者:大飞
功能简介:
原子域更新器,一般用于一些原子同步结构中。
源码分析:
首先看下AtomicIntegerFieldUpdater,AtomicIntegerFieldUpdater本身是一个抽象类,提供了一个静态工厂方法来生成实例:
public abstract class AtomicIntegerFieldUpdater<T> {
/**
* Creates and returns an u ...
Jdk1.6 JUC源码解析(2)-atomic-AtomicXXXArray
作者:大飞
功能简介:
数组原子量。
源码分析:
和原子量一样,数组原子量内部有一个Unsafe的静态引用。
private static final Unsafe unsafe = Unsafe.getUnsafe();
首先先看下AtomicIntegerArray。
AtomicIntegerArray的构造方法如下:
/**
* Creates a new A ...
Jdk1.6 JUC源码解析(1)-atomic-AtomicXXX
作者:大飞
功能简介:
原子量和普通变量相比,主要体现在读写的线程安全上。对原子量的是原子的(比如多线程下的共享变量i++就不是原子的),由CAS操作保证原子性。对原子量的读可以读到最新值,由volatile关键字来保证可见性。
原子量多用于数据统计(如接口调用次数)、一些序列生成(多线程环境下)以及一些同步数据结构中。
源码分析:
首先,原子量的一些较底层的操作都是来自sun.misc.Unsafe类,所以原子量内部有一个Unsafe的静态引用。
pri ...
一个小编程题-递归方式生成N位格雷码
- 博客分类:
- 算法
今天群友发了一个小编程题,使用递归的方式生成N位格雷码。
首先了解了一下格雷码及其递归思路,但写起来还是调试了很久。
代码如下:
public static String[] createGrayCode(int n){
String[] codes = new String[2 << (n - 1)];
createGrayCode(codes, n);
return codes;
}
private static void createGrayCode(String[] codes, int n ...
一个小编程题-找出最长不重复子字符串
- 博客分类:
- 算法
原题:
Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc". For "bbbbb" the longest substring is "b".
思路:
可以顺序遍历字符串,并将字符出现的位置记录 ...
一个小编程题-确定字符互异
- 博客分类:
- 算法
原题:
请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。
给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符。字符串的长度小于等于3000。
测试样例:
"aeiou"
返回:True
"BarackObama"
返回:False
思路:
首先想到如果可以有一个辅助的hash表,把遍历过的字符存储起来,这样会很容易判断。但题目要求不能使用额外存储结构,再一个,字符为ASCI ...
今天群友出了一题:
一个数列,把第一个元素删除,然后把第二个元素放到数列的最后,依次操作下去,直到把数列中所有的数都删除,要求依次打印出这个过程中删除的数。
想一下这个过程类似于约瑟夫环,相当于把数组当成一个环,然后每隔一个数删掉一个数,直到把所有的数删完,当然这个过程中要打印出被删除的数。
/**
* 思路:弄一个bit数组和目标数组一一对应,如果目标数据项被'删除',
* 那么在对应的bit数组上做一下标记,下次数step的时候会跳过这些
* 别标记的bit。
*
* @param a ...
计算一个int型数值中bit-1的个数
- 博客分类:
- 算法
之前面试遇到过这样的问题:写一个方法,统计出一个int型数值中比特值为1的比特个数,后来群里也讨论过,在这里总结一下。
直观的看一下这个问题的解法。
假设一个int型数值为80。
首先,将这个数值转化成二进制形式。
80 = 00000000 00000000 00000000 01010000
然后数一数为1的bit有几个,很明显是2个,那么结果就是2。
但是写程序要怎么做呢?
首先看一个小技巧,x & (x-1)会把x中最右边为1的bit变成0,利用这个小技巧我们 ...
不用加减符号实现加减法
- 博客分类:
- 计算机基础
今天有群友发了一个问题,要求不用加减符号(包括负号)来实现加减法。
分析一下,先看最简单的情况,假设1+1,按二进制算的话结果是10,可以看到从右往左的第一位变为0,第二位由于进位变为1。
第1位的值有4种,0+0=0、1+0=1、0+1=1、1+1=0,这正好符合“异或”的情况。
第2位的值来自于第一位的进位加上本身的值,进位的情况也有4种,0+0=0、1+0=0、0+1=0,1+1=1,这正好符合“与”的情况。
考虑一般性,a+b就等同于a^b + (a&b) << 1,而这又是一个加法,可递 ...
今天看到群友发的一个问题:写一个小程序打印第n个斐波那契数。
自己试了下,搞了好久。。。基础要加强了。
进入正题,什么是斐波那契数列就不说了,拿到这个题目,直接写出如下代码:
public static long findFibonacci(int n){
if(n <= 2){
return 1;
}else{
return findFibonacci(n - 1) + findFibonacci(n - 2);
}
}
运行一下,输入n分别为:1,2,3,4, ...
Java lang包-Boolean
- 博客分类:
- Java基础
Boolean类是Java中基本类型boolean的包装类。这个类比较简单,直接看源代码吧。
public final class Boolean implements java.io.Serializable,
Comparable<Boolean>
可以看到有final修饰,说明这个类是不能被继承的,而且是可序列化和可比较的。
Boolean内部以一个boolean型的私有域来保存状态。
/**
* The value of ...
Java中怎么拷贝一个对象呢?可以通过调用这个对象类型的构造器构造一个新对象,然后将要拷贝对象的属性设置到新对象里面。Java中也有另一种不通过构造器来拷贝对象的方式,这种方式称为克隆。
Java提 ...
看这个类之前,先看一下Java的枚举——Enum。
枚举是啥?编码时我们经常需要写int型常量,在某些情况下(不是全部),用枚举更合适。举个例子,在程序中需要两个常量表示性别(男、女)。可能刚开始(JDK1.5之前)我们会这样写:
/**
* 男
*/
public static final int MALE = 1;
/**
* 女
*/
public static final int FEMALE = 0;
当然这么写也没什么错误,还算一目了然,用起来也还算方便。但仔细想一下这样会有什么问题! ...
开发中有时会遇到这样的情况。要求某个调度器去调度一些任务,这些任务放在队列里。任务本身有优先级,调度器要按照优先级去调度队列里的任务,当然也会有新任务不断加入到队列中。
可以类比操作系统调度程序,操作系统要调度某个进程,简单的说会根据某种优先级进行调度(比如某些情况下,先执行时间较短的任务,保证短任务尽快结束。)
所以期望有这样一种数据结构,首先它是一个队列,可以从这个队列中不断取出优先级最高的(也可以认为是最大的或者最小的,因为本质是通过比较决定。)元素。也可以不断的将新元素添加到这个队列。
这种数据结构就叫做优先队列。优先队列的 ...