1..class和.dex文件

对于Java而言,编译后生成的是.class文件

而对于android而言,.class文件是中间状态,还需要将.class文件通过dex工具变成.dex文件,最终变成.apk文件

如一个类Demo,注意一定不要将它写在xx.com.example下,而是直接写在java文件夹下(即不要导入任何包)

血的教训,千万不要写入任何路径,否则会像我一样折腾半天

Demo类定义如下,里面写了一个foo()的方法,且被synchronized修饰(可以对比一下有无修饰生成的.dex文件的不同)


public class Demo {public synchronized static void foo() {int a = 1;int b = 2;int c = a * b;}
}

生成的.class文件在build/intermediates/javac/debug/路径下(获取.class文件的方法 :  make project即可)

public class Demo {public Demo() {}public static synchronized void foo() {int a = 1;int b = 2;int var10000 = a * b;}
}

在android的sdk路径中,会有不同版本的build-tools,在windows下默认的android sdk路径是

C:\Users\xxxx\AppData\Local\Android\Sdk

我们可以使用dx.bat工具将android studio 编译生成的,class文件变成,dex文件

通过下面的命令就可以将Demo.class文件转成Demo.dex文件并将其存储为txt文件

dx --dex --verbose --dump-to=Demo.dex.txt --dump-method=Demo.foo --verbose-dump Demo.class

但是可能不会成功,Demo.class不在dx.bat所在的路径下  或者 dx.bat的路径不在环境变量中

我采取了第二种方式,将dx.bat的路径加入到环境变量中(就是将C:\Users\xxx\AppData\Local\Android\Sdk\build-tools\28.0.3 加入到path中)

然后再运行,可能还是没有出来想要的结果

此时可能就是因为在写Demo文件的时候import了包名,而dx找不到对应的包,所以无法生成,比如下面写的

package com.example.myapplication;public class MyTest {public synchronized static void foo() {int a = 1;int b = 2;int c = a * b;}
}

排除各种错误,此时我们生成了.dex文件

Demo.foo:()V:
regs: 0003; ins: 0000; outs: 00000000: code-address0000: local-snapshot0000: code-address0000: code-address0000: local-snapshot0000: const/4 v0, #int 1 // #10001: local-start v0 "a": int0001: const/4 v1, #int 2 // #20002: local-start v1 "b": int0002: mul-int v2, v0, v10004: local-start v2 "c": int0004: code-address0004: code-address0004: local-snapshotv0 "a": intv1 "b": intv2 "c": int0004: return-void0005: code-addressdebug infoline_start: 4parameters_size: 00000000: prologue end0000: line 40001: line 50001: +local v0 a int0002: line 60002: +local v1 b int0004: line 70004: +local v2 c intend sequencesource file: "Demo.java"

我们也可以通过javap -v -c -s -l Demo.class 直接通过Java的方式编译Demo.class文件

javap -v -c -s -l Demo.class

可以看到通过dex工具编译和直接使用javap编译,生成的指令是不同的。

dex去除了冗余信息,但是指令的地址是2-3个字节,指令更加密集,dex是基于寄存器,寻址方便

而java则是单字节,指令更多,java栈需要更多次load与store指令

2.synchronized

发现有无synchronized的区别在于monitor-enter和monitor-exit

任意对象都可以成为锁 -> Object

sychronized实质上就是通过monitor的方式去进行控制的。

sychronized虽然有很多好处,可以实现线程安全,但是由于它无法在java层拿到当前对象状态,无法判断锁的状态,以及不清楚当前线程是否被锁住。此外,它是不可中断的,如果线程无法拿到锁,就会一直等待,导致资源的浪费,它是一种非公平锁,可重入锁,在monitor-enter和mointor-exit之间的过程不可控,如果多个线程竞争同一把锁,sychronized就会从偏向锁最终升级为重量级锁,造成从用户态切换到内核态。

sychronized理解相关推荐

  1. [转]关于java中的 sychronized 同步方法 与 同步块的理解

    首先,需要说明一点,也是最重要的一点,无论是同步方法 还是 同步块 都是只针对同一个对象的多线程而言的,只有同一个对象产生的多线程,才会考虑到 同步方法 或者是 同步块,如果定义多个实例的同步,可以考 ...

  2. 对Java单例模式 volatile关键字作用的理解

    单例模式是程序设计中经常用到的,简单便捷的设计模式,也是很多程序猿对设计模式入门的第一节课.其中最经典的一种写法是: class Singleton {private volatile static ...

  3. Android多线程研究(8)——Java中的原子性理解

    一.什么是原子性 原子性是世界上最小单位,具有不可分割性.比如a=0;(a非long和double类型)这个操作是不可分割的,那么我们说这个操作是原子操作.再比如:a++;这个操作实际上是a=a+1; ...

  4. java class教程_深入理解Java Class文件格式(七)

    本专栏列前面的一系列博客, 对Class文件中的一部分数据项进行了介绍. 本文将会继续介绍class文件中未讲解的信息. 先回顾一下上面一篇文章. 在上一篇博客中, 我们介绍了: this_class ...

  5. 理解java中的happens-Before

    引言 Java的内存模型是主内存和工作内存,我们在进行程序调用的时候,变量值都是从主内存中读取然后复制一个副本,对这个副本进行操作.到最后将这个副本再更新到主内存中.但是这个只是针对于单线程,那如果是 ...

  6. java高并发程序设计(二)线程状态,sychronized,wait,notify,AtomicInteger,CountDownLatch

    线程同步之sychronized细究 1.1 关于sychronized的小例子 多线程环境下,如果采用有锁编程可以考虑Sychronized和ReentrantLock,首先介绍一下sychroni ...

  7. 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)读书笔记

    前言 我在读 深入理解java虚拟机 这本书,把整体其中的关键点标记了,希望自己对它有个不一样的理解,也希望大家能看看这本写的很好的书 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) pd ...

  8. 理解Java内存模型(JMM)

    本篇的写作思路是先阐明Java内存区域划分.硬件内存架构.Java多线程的实现原理与Java内存模型的具体关系,在弄明白它们间的关系后,进一步分析Java内存模型作用以及一些实现手段 理解Java内存 ...

  9. Java线程的一点理解

    1.线程和进程的区别 进程是资源进行分配和调度的基本单位 进程包含线程 进程有自己 线程cpu调度的最小单位 2.线程的生命周期 一个线程被创建变成了new,在获取到除了cpu之外的资源后变成了run ...

最新文章

  1. python中intvar_在Python线程中使用Intvar/DoubleVar是否安全?
  2. Silverlight初级教程系列
  3. PaaS中OpenShift持久化存储的管理实践
  4. CSS--CSS清除浮动的4种方式
  5. c# vs2005 多线程中调用窗体控件 (摘)
  6. 代码创建数据库_表--SqlServer数据库
  7. hdu 5402 Travelling Salesman Problem (技巧,未写完)
  8. python的if语句后面怎么加布尔运算符号是_10、python---- if布尔条件控制语法(二)...
  9. Entry模拟对输入的密码进行验证是否符合规范
  10. 计算机如何共享文件夹给另一台电脑,如何共享文件夹到另一台电脑,两台电脑要怎么共享文件呢?...
  11. linux命令行 jdb,什么使用加多宝(jdb)在linux下调试Java程序
  12. 人才缺口上百万,年薪50万+!
  13. 计算机辅助设计对提升产品质量,浅谈CAD技术与计算机辅助设计的应用
  14. 3GPP TS 23501-g51 中英文对照 | 4.3.5 Service Exposure in Interworking Scenarios
  15. 嵌入式开发:当用微控制器构建嵌入式GUI时,有哪些注意事项
  16. [SDOI2009]学校食堂Dining 洛谷p2157
  17. 自实现微微型axios
  18. html网页打不开二级网页,遇到二级网页打不开怎么办 讲解二级页面打不开的处理方法...
  19. 【ML】欠拟合(underfitting)和 过拟合(overfitting)实践(基于sklearn)
  20. [DeeplearningAI笔记]序列模型2.1-2.2词嵌入word embedding

热门文章

  1. excel如何自动排列序号
  2. fflonK: a Fast-Fourier inspired verifier efficient version of PlonK
  3. Struts2在开发时报NullPointerException的问题
  4. 代下载图书 代下载文献
  5. 鸿蒙开源oppo,华为鸿蒙开源,OPPO公关粗鄙言论将自己置于舆论风暴中
  6. Windows启动失败修复,提示Boot\BCD,Status:0xc00000f
  7. 【vue】仿小米商城系统(三)
  8. JS监听键盘组合事件
  9. supercharge快充_发挥华为手机最大充电效率,SuperCharge 快速充电器开箱
  10. Synchronized锁升级过程