一、访问权限的范围:
public > protected > default(即包访问权限) > private 【 default不能修饰变量】
private | default | protected | public | |
同一类 | 1 | 1 | 1 | 1 |
同一包中的类 | 0 | 1 | 1 | 1 |
子类 | 0 | 0 | 1 | 1 |
其他包中的类 | 0 | 0 | 0 | 1 |
1、访问权限控制符:
1)public:共有访问。对所有的类都可见。
2)protected:保护型访问。对同一个包可见,对不同的包的子类可见。
3)default:默认访问权限。只对同一个包可见,注意对不同的包的子类不可见。
4)private:私有访问。只对同一个类可见,其余都不见。
2、非访问权限控制符
1)static 修饰符,用来创建类方法和类变量。
2)final修饰符,用来修饰类、方法和变量,final修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
3)abstract 修饰符,用来创建抽象类和抽象方法。
4)synchronized 用于多线程的同步。
5)volatile修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
6)transient:序列化的对象包含被 transient 修饰的实例变量时,JVM跳过该特定的变量。
3、字段修饰符
包括new,private,protected,public,internal,static和readonly几种。对于形式参数来说,只能用final修饰,其他任何修饰符都会引起编译器错误。但是用这个修饰符有一定的限制,就是在方法中不能对参数做任何修改,一般情况下不会用这个,只有在方法内部类才会用final修饰一个方法的形参。
关于volatile的一些备注:
volatile的作用:
1)禁止了指令重排:用于确保将变量的更新操作通知到其他线程,当把变量声明为volatile类型后,编译运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。然而,在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比 synchronized关键字更轻量级的同步机制。
2)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量值,这个新值对其他线程是立即可见的。
3)不保证原子性(线程不安全)
synchronize和volatile关键字比较:
1)volatile关键字是线程同步的轻量级实现,所以volatile性能肯定比synchronized关键字要好。但是volatile关键字只能用于变量而synchronized关键字可以修饰方法以及代码块。synchronized关键字在JavaSE1.6之后进行了主要包括为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁以及其它各种优化之后执行效率有了显著提升,实际开发中使用 synchronized 关键字的场景还是更多一些。
2)多线程访问volatile关键字不会发生阻塞(可见性),而synchronized关键字可能会发生阻塞。
3)volatile保证有序性,可见性,不能保证原子性(synchronize保证这三大性)。
4)volatile关键字主要用于解决变量在多个线程之间的可见性,而synchronized关键字解决的是多个线程之间访问资源的同步性。