互联网请回答2020
Syn里涉及到了 对象头 包含对象头、填充数据、实例变量。这里可以看一个美团面试题: 问题一:new Object()占多少字节
问题二:User (int id,String name) User u = new User(1,"李四") markword 8字节 + 开启classPointer压缩后classpointer 4字节 + instance data int 4字节 + 开启普通对象指针压缩后String4字节 + padding 4 = 24字节 10.3 Synchronized 锁升级
synchronized 锁在JDK6以后有四种状态,无锁、偏向锁、轻量级锁、重量级锁。这几个状态会随着竞争状态逐渐升级,锁可以升级但不能降级,但是偏向锁状态可以被重置为无锁状态。大致升级过程如下 9、CAS Compare And Swap:比较并交换,主要是通过处理器的指令来保证操作的原子性,它包含三个操作数: V:变量内存地址 A:旧的预期值 B:准备设置的新值 当执行CAS指令时,只有当 V 对应的值等于 A 时才会用 B 去更新V的值,否则就不会执行更新操作。CAS可能会带来ABA问题、循环开销过大问题、一个共享变量原子性操作的局限性。如何解决以前写过,在此不再重复。 10、Synchronized 10.1 Synchronized 讲解 Synchronized 是 JDK自带的线程安全关键字,该关键字可以修饰实例方法、静态方法、代码块三部分。该关键字可以保证互斥性、可见性、有序性(不解决重排)但保证有序性。 Syn的底层其实是C++代码写的,JDK6前是重量级锁,调用的时候涉及到用户态跟内核态的切换,挺耗时的。JDK6之前 Doug Lea写出了JUC包,可以方便的让用于在用户态实现锁的使用,Syn的开发者被激发了斗志所以在JDK6后对Syn进行了各种性能升级。
10.2 Synchronized 底层 如有两个线程调用func函数时传入的指针(引用)指向了同一个堆上的变量,那么该变量就变成了这两个线程的共享资源,在这种情况下func函数依然不是线程安全的。 改进也很简单,那就是每个线程调用func函数传入一个独属于该线程的资源地址,这样各个线程就不会妨碍到对方了,因此,写出线程安全代码的一大原则就是能用线程私有的资源就用私有资源,线程之间尽最大可能不去使用共享资源。 如果线程不得已要使用全局资源呢? 使用全局资源
使用全局资源就一定不是线程安全代码吗?答案还是。。有的同学可能已经猜到了,答案依然是要看情况。如果使用的全局资源只在程序运行时初始化一次,此后所有代码对其使用都是只读的,那么没有问题,就像这样: (编辑:惠州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |