倔强青铜
由以上的结果可以明确我们的答案是正确的,那为什么多线程在某些情况下会比单线程还要慢呢?这是因为多线程有创建和上下文切换的开销。
2.4 Java内存模型
Java内存模型全称:Java Memory Model ,简称Java内存模型或者JMM,Java线程之间的通信由JMM来控制,JMM决定一个线程对共享变量的写入,何时对另外一个线程可见。我们由图可见,线程之间的共享变量是存储在主内存当中,每一个线程都有一个属于自己的本地内存(也可以叫做工作内存),这个本地内存中存储了主内存当中的共享变量。就相当于把主内存的共享变量copy了一份给自己。为了提供效率,线程是不会直接与主内存进行打交道,而是通过本地内存来进行数据的读取。
lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态。
JMM是一种规范,其中定义几条规则,小编挑选出相对本文比较重要的:
秩序白银
3.2 多线程带来的原子性问题
sync怎么解决有序性问题呢?
荣耀黄金
下载之后为了方便浏览,小编建议你们可以去下载一个CLion工具来看代码,或者直接用文本编辑器打开也行。
monitor里面包含了什么?
永恒钻石
以上这个表格数据不能乱来对不对,我们可以查看源码:src/share/vm/oops/markOop.hpp
在打印看结果,就是16个字节。
至尊星耀
7.1 偏向锁
public class SyncExample4 {
public static void main(String[] args) {
Apple apple = new Apple;
apple.start;
}
}
class Apple extends Thread {
private Object lock = new Object;
@Override
public void run {
synchronized (lock) {
System.out.println(ClassLayout.parseInstance(lock).toPrintable);
}
}
}
OFFSET SIZE TYPE DESCRIPTION VALUE
0 4 (object header) 05 d8 86 22 (00000101 11011000 10000110 00100010) (579262469)
4 4 (object header) 9c 7f 00 00 (10011100 01111111 00000000 00000000) (32668)
8 4 (object header) e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)
12 4 (loss due to the next object alignment)
Instance size: 16 bytes
Space losses: 0 bytes internal 4 bytes external = 4 bytes total
由于大小端存储,原本偏向锁和锁位标识是在最后的,现在我们需要看最前8位数:00000101
轻量级锁原理
☞比特币当赎金,WannaRen 勒索病毒二度来袭!
☞深度|一文读懂“情感计算”在零售中的应用发展
☞三大运营商将上线5G消息;苹果谷歌联手,追踪30亿用户;jQuery 3.5.0发布|极客头条
☞曾遭周鸿祎全网封杀的360猛将:草根打工到36岁身家上亿的逆袭!
☞从Web1.0到Web3.0:详析这些年互联网的发展及未来方向
☞一文读懂“情感计算”在零售中的应用发展
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至123456@qq.com 举报,一经查实,本站将立刻删除。