类修饰符:
public(公共访问控制符) 将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类。
friendly(默认访问控制符)只有在相同包中的对象才能使用这样的类。
abstract (抽象修饰符)将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现。
final (最终修饰符)将一个类生命为最终(即非继承类),表示他不能被其他类继承。
成员变量修饰符:
对于成员变量,子类与父类之间没有重写或重载的关系,只有能否访问、继承的关系,子类如果也定义了相同的变量,子类方法会优先读取子类定义的变量,子类没有重定义变量,则会去访问父类的变量。
public(公共访问控制符),指定该变量为公共的,他可以被任何对象的方法访问。
private(私有访问控制符)指定该变量只允许本类的方法访问,其他任何类(包括子类)中的方法均不能访问。
protected(保护访问控制符)指定该变量可以被本类和子类访问。在子类中可以覆盖此变量。
friendly(默认访问控制符) ,在同一个包中的类可以访问,其他包中的类不能访问。
final (最终修饰符)指定此变量的值不能变。
static(静态修饰符)指定变量被所有对象共享,即所有实例都可以使用该变量。变量属于这个类。
transient(过度修饰符)告诉编译器,在类对象序列化的时候,此变量不需要持久保存。
volatile(易失修饰符)保证了用volatile修饰的变量对所有线程的可见性,volatile 修饰的成员变量在每次被线程访问时,都强制从主内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到主内存。
volatile不能解决数据竞争问题(共享数据的线程安全问题)
/**
* 演示volatile不能解决数据竞争问题,只能保证变量可见性。
* <pre>
* count++的字节码层面:
* getstatic //读取静态变量(count)volatile保证所有线程再这一步读取到的值是主内存的最新值,但由于count++计算并不是原子操作(原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)),还是会发生线程安全问题
* iconst_1 //定义常量值 1
* iadd //count增加1
* putstatic //把count结果同步到主内存
* </pre>
*
* @author nodcat
*/
public class VolatileDemo {
public volatile static int count = 0;
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 10; i++) {
new Thread(() -> {
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int j = 0; j < 100; j++) {
count++;
}
}).start();
}
Thread.sleep(2000);
System.out.println("count=" + count);
}
}
方法修饰符:
public(公共控制符)指定方法可以从所有类访问。子类可以访问、继承、重载、重写该方法。
private(私有控制符)指定此方法只有本类的方法能访问,其他的类不能访问(包括子类)。子类无法访问该方法,自然也无法继承、重载该方法,对于子类不可见,但子类可以自己定义相同签名的方法。
protected(保护访问控制符)指定该方法可以被本类和子类进行访问,在子类中可以重写(覆盖)此变量。子类可以访问该方法,自然也可以继承、重载、重写该方法。
final (最终修饰符)指定该方法不能被重写(覆盖)。子类可以访问该方法,自然也可以继承、重载该方法,但无法重写该方法。
static(静态修饰符)指定不需要实例化就可以调用的方法。
abstract(抽象修饰符)指定该方法是一个抽象方法,所在的类必须是抽象类,需要由子类实现该方法。
synchronized(同步修饰符) 如果声明一个方法时,在前面加上关键字synchronized,那么这个方法就只能由一个线程运行。只能由一个线程运行是每次只能由一个线程运行的意思,并不是说仅能让某一特定线程运行。这种方法称为synchronized方法,有时也称为同步方法。
native(本地修饰符)指定此方法的方法体是用其他语言在程序外部编写的。
网友评论