1、保证线程安全:HashTable,synchronized;注意:单例模式有多种实现方式,有的实现方式是线程不安全的;volatile关键字不能保证线程安全,只能保证内存可见性和有序性,不能保证原子性。
2、HashMap,HashTable,ConcurrentHashMap的异同点
同:
(1)继承结构而言,三者都是继承Map接口的;
(2)存储的内容都是以键值对的形式存储;
异:
(1)线程安全,HashMap不是线程安全的,HashTable和ConcurrentHashMap都是线程安全的;
(2)null值处理,HashMap的key-value都可以为null,HashTable和ConcurrentHashMap的key-value都不能为null;
(3)数据结构,HashMap和HashTable底层都是数组+链表,ConcurrentHashMap底层是数组,数组内部是数组+链表的形式;
(4)初始默认值,HashMap和ConcurrentHashMap数组初始大小为16,HashTable数组初始大小为11;
(5)增长方式,HashMap和ConcurrentHashMap都是2倍扩容,HashTable是2倍+1扩容;
(6)hash计算方法,HashTable和ConcurrentHashMap直接使用key的hashcode值,而hashMap对key的hash值重新计算;
3、进程与线程的区别
(1)定义,进程是资源分配的最小单位,线程是资源调度的最小单位;
(2)对应关系,一个进程可以包含多个线程;
(3)健壮性,进程之间相互隔离,一个进程崩溃不会影响其他进程,一般多个线程共享资源,一个线程崩溃可能导致其他线程崩溃;
4、start()与run()方法的区别
(1)start()方法是真正启动线程,而调用run()方法是普通方法调用 ;
(2)start()方法不能重复调用,run()方法可以重复调用;
(3)start()方法可以中断
5、sleep(),yield(),join()方法的区别
(1)方法作用不同,sleep()方法作用是让线程睡眠给定时间,暂停执行;;调用yield()方法作用让步作用,调用join()方法是等待作用,父线程中,子线程调用该方法,使子线程执行结束后父线程才执行;
(2)线程状态转换不同,调用sleep()方法,线程状态由RUNNING到TIMED_WAITING;调用yield()线程状态由RUNNING到RUNNABLE;调用join()方法线程状态由RUNNING到BLOCKED;
(3)sleep()方法和yield()方法是Thread的静态方法,而join()是实例方法(Object.join())
6、ReentrantLock与synchronized的区别
(1)使用上不同,synchronized有三种使用方式(静态方法,一般方法,代码块),ReentrantLock使用是显性加锁和解锁;
(2)synchronized不能实现公平锁,Reentrant