根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法。
(1)final类不能被继承,没有子类,final类中的方法默认是final的。
(2)final成员变量表示常量,只能被赋值一次,赋值后值不再改变。
(3)final不能用于修饰构造方法。
注意:父类的private成员方法是不能被子类继承的,更不存在被覆盖,因此private类型的方法默认是final类型的。
===========================================================================================================
(1)synchronized关键字的作用域有二种:
A,某个对象实例内。synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法,相当于每一次运行到这个方法,都要检查有没有其它正在用这个方法的程序,有的话要等其它运行完这个方法后再运行此线程;没有的话,直接运行(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。但是,不同的对象实例的synchronized方法是不相干扰的,也就是说其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法。
B,某个类的范围。synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。综合以上两点可以得出结论,synchronized修饰在静态方法上表示调用前要获得类的锁,而在非静态方法上表示调用此方法前要获得对象的锁。
(2)除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是:private final Object mLock = new Object(); ........... synchronized(syncObject){/*区块*/},它的作用域是当前对象,syncObject可以是类实例或类(如果代码段所在函数是static的,则syncObject本身也要有static修饰,否则提示:non-static variable syncObject cannot be referenced from a static context)。
(3)关于死锁。多个代码段加锁的目的就是为了这几个代码段之间互斥执行,如果一个synchronized(syncObject)代码段中的函数调用了另一个函数B,而函数B中也有synchronized(syncObject)代码段,这就造成了死锁。因为两者约束了同一个syncObject。