Java虚拟机简单入门你需要了解的哪些知识

  俗话说得好,工欲善其事必先利其器,对于Java开发者来说,简单了解Java虚拟机某些特性有益于提升开发者的内功。为什么我们在编写Java代码前,需要安装并且配置好JDK?JDK内置的这些包功能为什么这么强大?为什么我们的程序会出现内存泄露呢?为什么在代码中加入Synchronized关键字多线程访问程序不会出现数据不一致问题?好多类似的问题,在我们了解JVM之后就会得到答案。

                                             

 《深入理解Java虚拟机》 周志明著  这本书大家普遍推荐。

主要组成部分:

                                         

public class happenBeforeDemo {
    private int value = 0;
    public int getValue() {
        return value;
    }
    public void setValue(int value) {
        this.value = value;
    }
    public static void main(String[] args) {
        happenBeforeDemo happenBeforeDemo = new happenBeforeDemo();
        new Thread(() -> happenBeforeDemo.setValue(22)).start();
        new Thread(() -> System.out.println(happenBeforeDemo.getValue())).start();
    }
}

 

大家猜测下输出的结果是什么?0还是1?而这段代码遵循的是什么原则?

先行并发原则是什么?

    程序次序规则 管程锁定规则  volatile变量规则  线程启动规则   线程终止规则   线程中断规则   对象终结规则   传递性 

    衡量线程安全性问题 不要受时间顺序的干扰 而是一切以先行发生原则为基准

    由于第一个线程和第二个线程分别调用setValue()和getValue()两个函数,不在同一个线程中,程序次序规则不适用,由于没有同步块则自然不会发生lock操作与unlock操作,管程锁定不适合。由于value没有添加volatile修饰,自然就没有volatile变量规则,后面的线程启动,线程终止,线程中断,对象终结规则也和这里没有关系。最后一条传递性也不适用。所以该操作为线程不安全操作。

解决方案也比较常见

/**
 *线程A  访问getValue   线程B访问setValue
 *解决方案  synchronized   volatile
 */

 

我们知道这段代码最终会编译成.class文件,在我们查看字节码之前,先了解下以下简单的知识。

字节码的格式说明:

1:魔术与Class文件的版本  2:常量池  3:访问标志  4:类索引父索引与接口索引集合 5:字段表集合 6:方法表集合 7:属性表集合(1code 2Exceptions 3 LineNumberTable 4LocalVariableTable 5 SourceFile属性 6ConstantValue属性 7 InnerClasses 8 Deprecated以及Synthetic属性 9 StackMapTable属性(JDK1.6后加的) 10 Signature属性(JDK1.5后加的)11 BootstrapMethods属性(JDK1.7后加的))。。。。

https://mp.weixin.qq.com/s?__biz=MzUzNTY1MzE3NA==&mid=2247484019&idx=1&sn=eeee2f3bca2ce7bcc7c156bc24dc553c&chksm=fa837c2acdf4f53cdf4a3c929914671837b495154a0dfb76cbc3da435faae112624c050acc32&token=1666815065&lang=zh_CN#rd

更多内容关注微信公众号  

                                                            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远方的飞猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值