无锡哪家医院做试管婴儿可以供卵?

无锡薇電█ 188★2335★0811 ████试管选性别███供卵试管婴儿代孕███选性别生男孩 ████试管包出生████代孕男孩████代孕包出生███代孕选性别██试管婴儿███代孕生男孩█████ ​助孕人群,不孕不育,发育不良,同性恋,石女,大龄女,子宫肌瘤,子宫内膜炎,子宫内膜移位,少精弱精,等等人群......
看源码前我们必须先知道一下ConcurrentHashMap的基本结构。ConcurrentHashMap是采用分段锁来进行并发控制的。
其中有一个内部类为Segment类用来表示锁。而Segment类里又有一个HashEntry<K,V>[]数组,这个数组才是真正用
来存放我们的key-value的。
大概为如下图结构。一个Segment数组,而Segment数组每个元素为一个HashEntry数组
看源码前我们还必须了解的几个默认的常量值:
DEFAULT_INITIAL_CAPACITY = 16 容器默认容量为16
DEFAULT_LOAD_FACTOR = 0.75f 默认扩容因子是0.75
DEFAULT_CONCURRENCY_LEVEL = 16 默认并发度是16
MAXIMUM_CAPACITY = 1 << 30 容器最大容量为1073741824
MIN_SEGMENT_TABLE_CAPACITY = 2 段的最小大小
MAX_SEGMENTS = 1 << 16 段的最大大小
RETRIES_BEFORE_LOCK = 2 通过不获取锁的方式尝试获取size的次数
以上以及默认值是ConcurrentHashMap中定义好的,下面我们很多地方会用到他们。
先从初始化开始说起
通过我们使用ConcurrentHashMap都是通过 ConcurrentHashMap<String,String> map = new ConcurrentHashMap<>();的方式
我们点进去跟踪下源码
/**
* Creates a new, empty map with a default initial capacity (16),
* load factor (0.75) and concurrencyLevel (16).
*/
public ConcurrentHashMap() {
this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR, DEFAULT_CONCURRENCY_LEVEL);
}
可以看到,默认无参构造函数内调用了另一个带参构造函数,而这个构造函数也就是不管你初始化时传进来什么参数,最终都会跳到那个带参构造函数。
点进去看看这个带参构造函数实现了什么功能
public ConcurrentHashMap(int initialCapacity,
float loadFactor, int concurrencyLevel) {
if (!(loadFactor > 0) || initialCapacity < 0 || concurrencyLevel <= 0)
throw new IllegalArgumentException();
if (concurrencyLevel > MAX_SEGMENTS)
concurrencyLevel = MAX_SEGMENTS;
// Find power-of-two sizes best matching arguments
int sshift = 0;
int ssize = 1;
while (ssize < concurrencyLevel) {
++sshift;
ssize <<= 1;
}
this.segmentShift = 32 - sshift;
this.segmentMask = ssize - 1;
if (initialCapacity > MAXIMUM_CAPACITY)
initialCapacity = MAXIMUM_CAPACITY;
int c = initialCapacity / ssize;
if (c * ssize < initialCapacity)
++c;
int cap = M

猜你喜欢

转载自www.cnblogs.com/rewq/p/10988395.html
今日推荐