Java教程

java笔记

本文主要是介绍java笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

java一共有50个关键字。

abstract    assertassert    booleanboolean    breakbreak    bytebyte
case    catch    char    class    const
continue    default    do    double    else
enum    extends    final    finally    float
for    goto    if    implements    import
instanceof    int    interface    long    native
new    package    private    protected    public
return    strictfp    short    static    super
switch    synchronized    this    throw    throws
transient    try    void    volatile    while
final:

修饰变量时,用以定义常量;

修饰方法时,方法不能被重写(Override);(注意:重载是指方法相同的多个函数,重写是指子类重写父类的同名方法)

修饰类时,类不能被继承。

final的内存语义,在final域初始化过程,不允许实例化和引用赋值发生指令重排序,即保证了final的不可变性。

try-catch-finally:

异常处理关键字。必须有try,catch/finally有其一即可。

java7中带来的try-with-resources特性,把资源开启写在try括号里,可实现资源自动回收。

synchronized

线程同步关键字。两种用法,可以synchronized(object)或者加在方法前。加在普通对象或者实例方法上为对象锁,加在.class对象或者静态方法上为类锁。

这个关键字可以引申出java锁的用法,也是一大块内容(待整理)

synchronized锁是基于monitor对象实现的,编译时会在每一处需要同步的代码块开始和起始处添加monitorenter和monitorexit指令。monitor其中计数器机制,monitorenter会把计数器加1,monitorexit会吧计数器减1;当计数器减到0时,锁就被释放了。

synchronized对同一线程是可重入的,不会出现“自己把自己锁死”;对于不同线程,同一时刻只能由一个线程获得锁并执行。

monitor底层是通过操作系统的mutex lock(互斥锁)实现的。

由于竞争锁的过程中可能引起线程状态的变化,过程中会发生用户态和内核态之间的切换,会对性能有影响。因此synchronized是一个重量级操作,所谓重量级就是指这种重量级锁依赖于底层的mutex,而且切换带来的代价比较大。jdk1.6引入了偏向锁和轻量级锁用来优化这个过程,如加入自旋让线程空跑一段时间。

JVM底层存储对象,对象有一个对象头属性,而对象头包括Mark word、类型指针和数组长度。Mark word中通过锁标志位来存储锁的不同状态。

java锁是分级别的,按低到高为无锁、偏向锁、轻量级锁、重量级锁,锁可以升级但不能降级。

instanceof:检测对象是否是一个类的实例,对象可以为null

volatile: 禁止指令重排序。

volatile的作用是提供轻量级的同步机制,可以保证有序性、可见性,但不保证原子性。

从JMM层面来讲,主内存和工作内存之间的动作可以归结为lock、unlock、read、load、use、assign、store、write。volatile关键字保证了read/load/use和assign/store/write分别必须是连续的,即读取变量必须从主内存刷新,写入变量必须同步到主内存中,这样使得修改的值立即可以被其他线程看见,也就保证了可见性。而有序性是禁止指令重排优化。不保证原子性,是因为虽然保证了读取和写入两个步骤的连续性,但并不保证读取和写入也是连续的。

volatile可以用来增强单例模式的double-check线程安全问题:避免初始化对象和赋值引用两条指令的重排。

default: java8引入的,用于在接口中声明默认方法

transient: 作用于序列化过程。任何实现Serializable接口的类都可以被序列化,但如果对象中的字段被transient修饰则不参与序列化过程,只存在于调用者的内存中。

被transient修饰的静态变量,其值并不会受序列化和反序列化过程干扰,仅以内存中的值为准。

序列化的两个接口:Serializable不需要实现任何方法,自动序列化;Externalizable,需要实现writeExternal方法指定序列化字段。

enum:用来定义枚举类型。

枚举类是个比较特殊的类型,由于在启动时加载而且仅加载一次,很安全的单例模式。

jdk提供的EnumSet, EnumMap通过位向量来压缩存储空间。例如EnumSet的实现有RegularEnumSet和JumboEnumSet,元素少于64个使用RegularEnumSet,内部用一个long变量作为位向量;多于64个则使用JumboEnumSet,内部用一个long数组作为位向量。

for:循环关键字。如果使用for-each语法需要注意空指针异常。
 

这篇关于java笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!