1.调用system.gc()是否会立即回收垃圾?
其实当我们调用system.gc()的时候并不会马上进行垃圾回收,甚至是最终是否进行垃圾回收都是未知数。
public static void gc() {
boolean shouldRunGC;
synchronized(lock) {
shouldRunGC = justRanFinalization;
if (shouldRunGC) {
justRanFinalization = false;
} else {
runGC = true;
}
}
if (shouldRunGC) {
Runtime.getRuntime().gc();
}
}
当justRanFinalization=true的时候才会执行
正确做法如下:
System.gc();
runtime.runFinalizationSync();
System.gc();
不到万不得已不要调用,因为jvm有自己的gc策略,根本不需要我们来手动
2.Hashmap和hashtable的区别是什么
HashMap和HashTable都实现了Map接口,但是两者的区别在于有以下几点点:
(线程安全性,同步,以及速度)
1.HashMap几乎等价于HashTable,HashMap是非线程安全的,并且介意为null值,
HashMap可以接受为null的key value 而HashTable不行。
2.HashTable是线程安全的多个线程可以共用一个HashTable,如果没有正确的同步,
多线程是不能共享HashMapJava5提供了CurrentHashMap去替代HashTable,比HashTable
的扩展性更好。
3.HashMap的迭代器是fail_fast的,而HashTable的enumerator迭代器不是fail_fast
4.HashTa环境下ble是线程安全的,所以在单线程环境下HashTable的速度
比单线程下的HashMap要慢。
5.HashMap不能保证随着时间的推移,Map中的元素次序是不变的。
3.我们能否让HashMap同步?
Hashtable和HashMap有几个主要的不同:线程安全以及速度。仅在你需要完全的
线程安全的时候使用Hashtable,而如果你使用Java 5或以上的话,请使用
ConcurrentHashMap吧。
4.Hashmap默认大小是多少?什么时候会resize?
什么是resize:
重新计算容量。
容量默认为16,负载因子(loadFactor)默认是0.75;
阈值 = 容量 X 负载因子;
threshold = (int)(capacity * loadFactor);
什么时候会resize:
当Map里面的元素个数size大于一个阈值(threshold)的时候map将自动扩容。
http://blog.csdn.net/longwoniu/article/details/48781777
5.你知道哪些设计模式,有哪些是在工作中用到的?如何实现一个简单的单例、Spring多例怎么实现(@Scope注解)
设计模式有:
单例模式,工厂模式,代理模式,命令模式,策略模式,门面模式,桥接模式等23种
常用的设计模式:
单例模式,工厂模式,代理模式。
单例:确保某一个类只有一个实例,自行实例化并且向整个系统提供这个实例。
单例:饿汉模式
public class ImageLoader{
private static ImageLoader instance = new ImageLoader();
private ImageLoader(){}
public static ImageLoader getInstance(){
return instance;
}
}
单例:懒汉式
public class ImageLoader{
private static ImageLoader instance;
private ImageLoader(){}
public static synchronized ImageLoader getInstance(){
if(instance == null){
instance = new ImageLoader();
}
return instance;
}
}
Spring多例怎么实现(@Scope注解)
@Scope 拥有多个属性,默认为singleton(单例模式)其中:
@Scope("prototype")表示的是多例模式
6.信号量是什么,java中是哪个包实现的。
可以控制同一时间状态下,线程对临界区域的资源访问。为了解决多个线程并发同一资源造成的数据不一致的问题。
Semaphore内部内置有一个计数器,计数器内部的值就代表了同一时间可以访问的共享资源个数。一个线程想要访问共享资源。
首先,获取信号量;
接着,如果信号量的数值大于1,那么该线程就可以访问这个这个共享资源,同时Semaphore内部的计数器的值要相应减1.,当该数值减为0的收,这个共享资源将不再被更多线程访问。
当线程不在访问这个共享资源的时候,Semaphore的计数器的值增加1个,此时,该共享资源可以接受另外一个线程的访问。
相当于厕所的蹲位只剩下一个一样,再进一个人,就没有办法在接收人进去,外界的人想进来蹲坑,只能是等着里面出去一个,外面进去一个。
使用方法:
Semaphore使用时需要先构建一个参数来指定共享资源的数量,Semaphore构造完成
后即是获取Semaphore、共享资源使用完毕后释放Semaphore
● Semaphore semaphore = new Semaphore(10,true);
● semaphore.acquire();
● //do something here
● semaphore.release();
备注:
● semaphore.acquire(),获取信号量,没信号量可用时,将进行阻
● semaphore.release(); 释放信号量
● 通过acquire()和release()获取和释放访问许可
7.CyclicBarrier Java种的应用?
俗称java栅栏
作用原理:
拦截所有的线程,直到所有的线程都完成之后才能准许通过。一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。
在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。
await方法:
public int await()
throws InterruptedException,
BrokenBarrierException
使用场景:
需要所有的子任务都完成时,才执行主任务,这个时候就可以选择使用CyclicBarrier
CyclicBarrier初始化时规定一个数目,然后计算出调用CyclicBarrier.await()方法进入等待状态中的线程数。当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续。
CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。
CyclicBarrier初始时还可带一个Runnable的参数, 此Runnable的任务是在CyclicBarrier的数目达到后,在所有其它线程被唤醒前被执行。
8.SSO登录原理
其实就是最常见的单点登录。
用户输入账户密码,登录系统,讲信息存储在Cookie中。当第二次登录的时候,系统会先行在Cookie中寻找,如果存在Cookie则直接给予权限登录系统,如果Cookie中不存在先关信息。那么不允许登录系统。