访问控制符、非访问控制符、字段修饰符

1、访问权限的范围:

public > protected > default(即包访问权限) > private 【 default不能修饰变量】html

private default protected public
同一类 1 1 1 1
同一包中的类 0 1 1 1
子类 0 0 1 1
其余包中的类 0 0 0 1

一、访问权限控制符:

1)public:共有访问。对全部的类均可见。web

2)protected:保护型访问。对同一个包可见,对不一样的包的子类可见。安全

3)default:默认访问权限。只对同一个包可见,注意对不一样的包的子类不可见。多线程

4)private:私有访问。只对同一个类可见,其他都不见。svg

二、非访问权限控制符

1)static 修饰符,用来建立类方法和类变量。性能

2)final修饰符,用来修饰类、方法和变量,final修饰的类不可以被继承,修饰的方法不能被继承类从新定义,修饰的变量为常量,是不可修改的。
3)abstract 修饰符,用来建立抽象类和抽象方法。优化

4)synchronized 用于多线程的同步。线程

5)volatile修饰的成员变量在每次被线程访问时,都强制从共享内存中从新读取该成员变量的值。并且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任什么时候刻,两个不一样的线程老是看到某个成员变量的同一个值。xml

6)transient:序列化的对象包含被 transient 修饰的实例变量时,JVM跳过该特定的变量。htm

三、字段修饰符

包括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关键字解决的是多个线程之间访问资源的同步性。

原文连接
https://www.cnblogs.com/yangrongkuan/p/12024763.html