JAVA中操作共享数据按照线程安全程度大致分为5类: 不可变,绝对线程安全,相对线程安全,线程兼容和线程对立
@Slf4j
public class TestVector {
private static Vector<Integer> vector = new Vector<>();
public void test() {
int count = 0;
while (true) {
count ++;
for (int i = 0; i < 10; i++) {
vector.add(i);
}
Thread removeThread = new Thread(() -> {
for (int i = 0; i < vector.size(); i++) {
vector.remove(i);
}
});
Thread printThread = new Thread(() -> {
for (int i = 0; i < vector.size(); i++) {
log.info("v: {}", vector.get(i));
}
});
removeThread.start();
printThread.start();
if (count > 20) break ;
}
}
}
public String concatString(String str1, String str2, String str3){
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(str1);
stringBuffer.append(str2);
stringBuffer.append(str3);
return stringBuffer.toString();
}
这里首先有一个概念是Mark Work HotSpot虚拟机的对象头分为两部分信息,第一部分用于存储对象自身的运行数据,如哈希码(Hash Code),GC分代年龄(Generational GC Age)等,这部分数据的长度在32位和64位虚拟机中分别为32bit和64bit,这就是Mark Word
存储内容 | 标志位 | 状态 |
---|---|---|
对象哈希码,对象分代年龄 | 01 | 未锁定 |
指向锁记录的指针 | 00 | 轻量级锁定 |
指向重量级锁的指针 | 10 | 膨胀(重量级锁定) |
空,不需要记录信息 | 11 | GC标记 |
偏向线程ID,偏向时间戳,对象分代年龄 | 01 | 可偏向 |
参考: [1] 深入理解Java虚拟机第二版