多线程习题总结

本文总结了多线程的相关知识点,包括线程安全、HashMap、HashTable与ConcurrentHashMap的异同、进程与线程的区别、start()与run()、sleep()、yield()和join()方法的使用、ReentrantLock与synchronized的区别、Future与FutureTask的对比,以及多线程编程中的火车站售票问题和哲学家就餐问题的解决方案。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值