加入收藏 | 设为首页 | 会员中心 | 我要投稿 惠州站长网 (https://www.0752zz.com.cn/)- 办公协同、云通信、物联设备、操作系统、高性能计算!
当前位置: 首页 > 业界 > 正文

5G终端连接量已超2亿

发布时间:2021-01-31 17:41:21 所属栏目:业界 来源:互联网
导读:Syn里涉及到了 对象头 包含对象头、填充数据、实例变量。这里可以看一个美团面试题: 问题一:new Object()占多少字节 markword 8字节 + classpointer 4字节(默认用calssPointer压缩) + padding 4字节 = 16字节 如果没开启classpointer压缩:markword 8字节

Syn里涉及到了 对象头 包含对象头、填充数据、实例变量。这里可以看一个美团面试题:

问题一:new Object()占多少字节

  • markword 8字节 + classpointer 4字节(默认用calssPointer压缩) + padding 4字节 = 16字节
  • 如果没开启classpointer压缩:markword 8字节 + classpointer 8字节 = 16字节

问题二: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以后有四种状态,无锁、偏向锁、轻量级锁、重量级锁。这几个状态会随着竞争状态逐渐升级,锁可以升级但不能降级,但是偏向锁状态可以被重置为无锁状态。大致升级过程如下
 

那么这时funcA函数依然是线程安全的,因为传入的参数是线程私有的局部变量,无论多少线程调用funcA都不会干扰到其它线程。

看了各种情况下的线程安全问题,最后让我们来总结一下实现线程安全代码都有哪些措施。

如何实现线程安全

从上面各种情况的分析来看,实现线程安全无外乎围绕线程私有资源和线程共享资源这两点,你需要识别出哪些是线程私有,哪些是共享的,这是核心,然后对症下药就可以了。

  • 不使用任何全局资源,只使用线程私有资源,这种通常被称为无状态代码
  • 线程局部存储,如果要使用全局资源,是否可以声明为线程局部存储,因为这种变量虽然是全局的,但每个线程都有一个属于自己的副本,对其修改不会影响到其它线程
  • 只读,如果必须使用全局资源,那么全局资源是否可以是只读的,多线程使用只读的全局资源不会有线程安全问题。
  • 原子操作,原子操作是说其在执行过程中是不可能被其它线程打断的,像C++中的std::atomic修饰过的变量,对这类变量的操作无需传统的加锁保护,因为C++会确保在变量的修改过程中不会被打断。我们常说的各种无锁数据结构通常是在这类原子操作的基础上构建的 。
  • 同步互斥,到这里也就确定了你必须要以某种形式使用全局资源,那么在这种情况下公共场所的秩序必须得到维护,那么怎么维护呢?通过同步或者互斥的方式,这是一大类问题,我们将在《深入理解操作系统》系列文章中详细阐述这一问题。

总结

怎么样,想写出线程安全的还是不简单的吧,如果本文你只能记住一句话的话,那么我希望是这句,这也是本文的核心:实现线程安全无外乎围绕线程私有资源和线程共享资源来进行,你需要识别出哪些是线程私有,哪些是共享的,然后对症下药就可以了。希望本文对大家编写多线程程序有帮助。

(编辑:惠州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读