线程安全

来源:互联网 发布:三维动画制作软件手机 编辑:程序博客网 时间:2024/04/30 11:09

1 下列代码返回的是()
package forteenDay;
import java.util.Date;
public class Test1 extends Date {

private static final long serialVersionUID = 1L;private void test1(){    //System.out.println(super.getClass());      //class forteenDay.Test1    //System.out.println(super.getClass().getName());                         //forteenDay.Test1    System.out.println(this.getClass().getName());   //forteenDay.Test1//System.out.println(this.getClass().getSuperclass().getName());//java.util.Date    //System.out.println(super.getClass().getSuperclass().getName());//java.util.Date}public static void main(String[] args) {    new Test1().test1(); //forteenDay.Test1}

}
A Test1
B forteenDay.Test1
C Date
D forteenDay.Date

  • 注: Test1 和 Date 的 getClass 都没有重写, 他们都是调用对象的getClass ,而对象的getClass()函数.返回的是运行时的类的名字, 这个运行时的类的名字就是当前的类,所以此时的super.getClass().getName() 返回的是(包名.正在运行类名), 如果想获取Date 的类名此时应该是super.getClass().getSuperClass()
  • 注意:getClass()返回的类的全路径。特别是要注意:返回的是运行时的类: 切记:可以这么理解:哪个类正在调用次方法,则返回哪个类。
  • 再就是注意:此处无论是super 还是 this 调用,都无关紧要,因为返回的是“运行时的类”, 此处,它运行在子类中故返回的是子类。

2 下列选型正确的是()
public class Test2 {

public static void main(String[] args) {    Object o = new Object(){         public boolean equals(Object obj)        {            return true;        }    };  //此处是匿名内部类,分号不能少    System.out.println(o.equals("haha")); //true}

}

A haha
B false
C true
D Object

  • 注解:考察匿名内部类 + 重写equal方法

3 下列输出结果正确的是()
public class Test3 {

public static void doSomething(Integer var2){    var2 = new Integer(2);}public static void main(String[] args) {    Integer var1 = new Integer(1);    Integer var2 = var1;    doSomething(var2);    System.out.println(var1.intValue()); //1    System.out.println(var1 == var2);    //true}

}

A 2 false
B 1 true
C 1 false
D 2 true

  • 注解: 此处的需要注意的是:Java程序设计语言总是按照‘值传递’,不管是基本数据类型还是应用数据类型,实参传进形参的都是实参的副本,只是对于基本数据类型,形参不可以改变实参的值,而对于引用数据类型,形参可以改变实参的是,特别是数组, 对于此题:传进去的var2是源var2 的一个副本,是在栈上申请的一个局部变量。它虽然在刚开始也和var2实参 一样指向同一块堆上的空间,但是函数体内部,其指向了一块新的空间,但是出了函数体。此时它的声明周期结束,而原先的var2 的指向压根就没有变。

    4 volatile 关键字的错误说法是()

    A 能保证线程的安全
    B volatile 关键字用在多线程的同步中, 可以保证读取的可见性
    C JVM 保证从主内存加载到线程工作内存的值是最新的
    D volatile能禁止进行指令重排序

  • 注解:
    出于运行速率的考虑,java 编译器会把常用的变量存放到缓存(严格来讲是工作内存)中, 读取变量则从缓存中读取但是在多线程的编程过程中,内存中的值和缓存中的值可能会出现不一致, 此时, volatile 用于限定变量只能从内存中读取,保证对所有的线程而言,读取的值都一样,但是volatile 不可以保证原子性,即不可保证线程安全,所以要自己加锁。

5 下列的陈述正确的是()?
A 垃圾回收线程的优先级很高,以保证不再使用的内存将被即逝回收;
B 垃圾收集允许程序开发者指定释放哪个对象
C 垃圾回收机制保证java 程序不会溢出
D 进入“Dead” 状态的线程将被垃圾回收器回收
E all error

  • 注解: A 首先,当一个程序运行的时候,至少有两个线程在运行,一个是主线程,一个是垃圾回收线程,垃圾回收线程的优先级较低
  • B 程序员不可以显示指定垃圾回收器回收对象,只能通过system.gc()来调用最多是推荐释放
  • C 垃圾回收机制只是回收不再使用的JVM内存, 如果程序有严重的BUG 此时,照样溢出
  • D 进入死亡状态的线程,还可以回复,gc不会回收。
    6 java 中HashTable Vector TreeSet LinkedList 哪些是线程安全的?
    A HashTable
    B Vector
    C TreeSet
    D LinkedList
  • 注解: 进程中有一段代码,可能有多个线程同时运行这段代码,如果这段代码运行的结果和单线程运行的结果相同,且其他的变量的值也和预计一样,此时称之为线程安全。线程安全问题一般涉及全局变量和静态变量引起的,如果每个线程中的全局变量和静态变量只读操作,而无写操作,一般来说这个全局变量是线程安全的, 若有多个线程同时执行写操作, 一般都要考虑线程同步。否则就可能影响线程安全。
  • Collection
  • |-List
  • | |- ArrayList
  • | |- LinkedList
  • | |- Vector
  • | |-Stack
  • |-Set

    • Map
  • |-HashMap
  • |-HashTable
  • |-weakHaskMap

    • LinkedList 和 ArrayList 都不是同步的,线程不安全
  • Vector Stack 是同步的, 线程安全
  • Set 不是同步的,线程不安全
  • HashTable 线程安全
  • HAshMap 不是线程安全
  • 强调:enumeration 枚举也是线程安全的。
0 0