您的位置:首页 > 职场人生

春招面试准备

2016-03-20 16:35 260 查看

Static,Final,Transient,Volatile关键字

Static方法中不能访问非静态的方法和变量,但是反过来非Static方法可以访问Static方法和变量。虽然没有显式的声明,类的构造器也是static

Static变量,被所有对象共享,内存中只有一个副本,非Static变量是对象拥有的,每个对象的副本不相互影响。

Static代码块,在类初次加载时,按照代码块的顺序,执行Static,并且只会执行一次 。针对于只需要一次初始化的情况,进行优化。

静态方法和对象可以通过this来进行访问。

Static不能用来修饰局部变量。

Final类,不能被继承。隐式的,成员方法没有机会被覆盖,默认也是final的。成员变量可以根据需要设定为final。

Final方法的使用有两种原因。1方法锁定,以防任何类修改含义;2编译器将final方法转为内联函数,提升效率。类的private方法会隐式的指定为final方法

final变量,数值在初始化后不能更改,引用变量则不能更改引用。

被final修饰的引用变量一旦初始化后不能指向其他的对象,但是该引用指向对象的内容是可变的。

Transient阻止实例中用此关键字声明的变量持久化。

变量被Transient修饰,变量不再是对象持久化的一部分,该变量在序列化后无法获得访问。

Transient只能修饰变量,而不能修饰方法和类。

被Transient修饰的变量不能再被序列化,一个静态变量不管是否被Transient修饰,均不能被序列化。

Volatile关键字,修饰共享变量时,保证了不同线程对变量进行操作时的可见性,即一个线程修改了某个变量的值,这个新值对其他线程来说是可见的。禁止进行指令重排序。

Volatile无法保证对变量的任何操作都是原子性,自增操作不是原子操作。采用synchronized或者lock或者AtomicInteger。

集合

Array是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。

Link是基于指针的数据结构,插入删除数据时,优于ArrayList。由于节点中存的是实际数据和前后节点的位置,比ArrayList每个索引存的是实际数据来得省空间。

HashMap是非synchronized实现,可以接受null的key&value。

HashTable是synchronized,线程安全,ConcurrenthashMap,替代HashTable。

多线程

多线程,发挥多核CPU的优势,单核多线程通过快速切换线程实现多线程。

单核CPU运行多线程时,频繁切换线程上下文,会降低效率,但是多线程可以防止阻塞。便于建模。

创建线程的两种方式,继承Thread类和实现Runnable接口。

start()方法才真正让不同线程里的run()方法交替执行。

Runnable接口中run()方法返回值是void,Callable接口中的call()方法是返回一个泛型,和Future FutureTask配合来获取异步执行的结果。

CyclicBarrier运行到某个点上,线程停止运行,直到所有线程都到达了这个点,所有线程才会重新运行。CountDownLatch是当某个线程运行到点上后,给数值-1,线程继续执行。计数为0的CountDownLatch不可再用。

Volatile保证了可见性,每次读取volatile变量一定是最新的数据。

Volatile禁止指令重排。

线程安全,1)不可变,像String,Long,Integer都是final类型的,不可变对象不需要任何同步手段就可以直接在多线程环境下使用。

绝对线程安全,CopyOnWriteArrayList、CopyOnWriteArraySet

相对线程安全,Vector的add和remove操作都是原子操作。

线程非安全,ArrayList和LinkedList和HashMap都是线程非安全的类。

java中获取线程dump,通过jstack。<
4000
/li>
线程出现运行时异常,异常没有被不活的话,线程停止执行。如果线程持有某个对象的监视器,那么这个对象监视器就会被立即释放

线程之间共享数据,通过共享对象,wait/notify/notifyAll await/signal/signalAll进行唤起和等待,阻塞队列的BlockingQueue是为线程间的数据共享设计的。

sleep和wait方法都可以用来放弃CPU一定的事件,不同是sleep方法不会放弃 这个对象的监视器,wait会放弃对象的监视器。

ThreadLocal以空间换时间,在每个Thread中维护一个以开放地址实现的ThreadLocalMap,把数据进行隔离,数据不共享。

wait notify/notifyall调用前必须获得对象的锁。

wait立即放弃对象监视器,notify/notifyall会等待线程剩余代码执行完毕才放弃对象监视器。

线程池,避免频繁的创建和销毁线程,达到线程对象的重用。线程池还可以根据项目灵活的控制并发的数目。

Thread类中提供了holdsLock方法,当对象的监视器被某条线程所持有的时候才会返回true。

synchronized是关键字,ReentrantLock是类,有各种方法。

ConcurrentHashMap的并发度就是segment的大小,默认为16,最多有16个线程可以同时操作ConcurrentHashMap

FutureTask表示异步运算的任务,可以传入一个Callable具体实现类,可以对这个一步运算的任务结果进行等待获取,判断是否已经完成,取消任务等操作。

唤醒阻塞线程,如果是因为wait()/sleep()/join()方法阻塞的话,可以中断线程,通过抛出InterruptedException来唤醒,如果线程遇到了IO阻塞,是操作系统实现的。

多线程上下文切换,指的是CPU的指令状态。

线程池队列已满,无界队列的话,继续存,有界队列的话,RejectedExecutionHandler处理满了的任务,默认是AbortPolicy。

线程调度算法,抢占式。一个线程用完CPU后,根据线程的优先级,计算出总的优先级并分配下一个时间片给线程执行。

Thread.sleep(0)的作用是为了调整CPU控制权,手动触发一次系统分配时间片的操作。

自旋让等待锁的线程在synchronized中做忙循环,而不被阻塞,等做了多次忙循环后再阻塞。

Java内存模型定义了多线程访问Java内存的规范。主内存和工作内存。定义原子操作,用于操作主内存和工作内存中的变量。定义了volatile变量的使用规则。

CAS全称, compare and set即比较-设置。

1.对象锁钥匙只能有一把才能互斥,才能保证共享变量的唯一性

2.在静态方法上的锁,和 实例方法上的锁,默认不是同样的,如果同步需要制定两把锁一样。

3.关于同一个类的方法上的锁,来自于调用该方法的对象,如果调用该方法的对象是相同的,那么锁必然相同,否则就不相同。比如 new A().x() 和 new A().x(),对象不同,锁不同,如果A的单利的,就能互斥。

4.静态方法加锁,能和所有其他静态方法加锁的 进行互斥

5.静态方法加锁,和xx.class 锁效果一样,直接属于类的

为表设置索引付出的代价。一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试