也许你感觉自己的努力总是徒劳无功,但不必怀疑,你每天都离顶点更进一步。今天的你离顶点还遥遥无期。但你通过今天的努力,积蓄了明天勇攀高峰的力量。
1、Hashtable 与 HashMap 的区别
- Hashmap 允许空( null)键值( key),非线程安全,效率高。在多个线程访问时必须提供外同步。
- HashMap 是 Java1.2 引进的 Mapinterface 的一个实现。
- Hashtable 不允许 key 为 null 值,线程安全,但是效率低。
- HashMap 把 Hashtable 的 contains 方法去掉了 ,改成 containsvalue 和 containsKey。
- Hashtable 和 HashMap 采用的 hash/rehash 算法大致一样,所以性能不会有很大的差异。
2、线程和进程的区别
线程是指在程序执行过程中,能够执行程序代码的一个基本执行单位,每个程序至少都有一个线程,也就是程序本身。
Java中的线程有四种状态:运行、就绪、挂起、结束。
进程是程序的基本执行实体,是线线程的容器。
进程具有的特征:
- 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
- 并发性:任何进程都可以同其他进程一起并发执行;
- 独立性:进程是系统进行资源分配和调度的一个独立单位;
-
结构性:进程由程序、数据和进程控制块三部分组成。
线程和进程的区别: - 隶属关系 : 线程是进程中的一部分,一个进程中可以包含若干个线程。进程可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。
- 地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。
- 进程间通信: 线程间可以直接读写进程数据段(如全局变量)来进行通信。需要进程同步和互斥手段的辅助,以保证数据的一致性。
- 调度和切换:线程上下文切换比进程上下文切换要快得多。
3、实现多线程程序的 2 种方式
多线程有两种实现方式:
继承 Thread 类。
实现 Runnable 接口 。
同步的实现方法有两种:
Wait():使一个线程处于等待状态,并且释放所持有的对象的 lock。
notify():唤醒一个处于等待状态的线程,在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由 JVM 确定唤醒哪个线程,不是按优先级。用 synchronized 关键字修饰同步方法反对使用 stop(),是因为它不安全。suspend()方法容易发生死锁。调用 suspend()的时候,目标线程会停下来,但仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被“挂起”的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的 Thread 类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用 wait()命其进入等待状态。若标志指出线程应当恢复,则用一个 notify()重新启动线程。
4、List,Set,Collection,Collections
- List 和 Set 都是接口,他们都继承于接口 Collection,List 是一个有序的可重复的集合,而 Set 是无序的不可重复的集合。 Collection 是集合的顶层接口, Collections是一个封装了众多关于集合操作的静态方法的工具类,因为构造方法是私有的,所以不能实例化。
- List 接口实现类有 ArrayList,LinkedList,Vector。 ArrayList 和 Vector 是基于数组实现的,所以查询的时候速度快,而在进行增加和删除的时候速度较慢 LinkedList 是基于链式存储结构,所以在进行查询的时候速度较慢但在进行增加和删除的时候速度较快。又因为 Vector 是线程安全的,所以他和 ArrayList 相比而言,查询效
率要低。
5、sleep()和 wait()有什么区别
sleep 是线程类( Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用 sleep 不会释放对象锁。 wait 是 Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出 notify 方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态相同点在于都会造成线程阻塞.
如果你浏览到这请耐心读完,你会有收获的,加油!!!
网友评论