面试题

1.sleep() 与wait()的区别
1.sleep方法只让出了CPU,而并不会释放同步资源锁!!!);wait()方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行,只有调用了notify()方法,之前调用wait()的线程才会解除wait状态,可以去参与竞争同步资源锁,进而得到执行。
2.sleep()方法可以在任何地方使用;wait()方法则只能在同步方法或同步块中使用;
3.sleep()是线程线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;wait()是Object的方法,调用会放弃对象锁,进入等待队列,待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才会进入锁池,不再次获得对象锁才会进入运行状态;

2.线程同步、线程异步?什么时候会产生线程安全问题,怎么解决线程安全
同步:同一个锁,线程安全
异步:不同锁,线程不安全
产生安全问题:多个线程抢占同一个资源时
解决:
1.同步方法:synchronized 修饰的方法 ex:public synchronized void test(){}
弊端:方法中的所有代码,都只允许一个线程访问。
(有一种情况:一个方法中,有一个部分代码不会涉及到线程安全问题,可以允许多个线程同时访问 == 》即下面的2.同步代码块)
2.同步代码块 : synchronized(被加锁的对象){ 代码 }
3.锁机制Lock
①创建ReentrantLock对象
②调用lock方法:加锁
{代码…}
③调用unlock方法:解锁
注意:可把解锁的unlock方法的调用放在finally{}代码块中,保证一定能解锁
提醒:在同步的时候,其他代码都可以多个线程同时执行!只是被同步的代码不能同时执行!

3.HashMap HashTable ConcurrentHashMap 区别
HashMap:底层数组+链表实现,可以存储null键和null值,线程不安全
HashTable:底层数组+链表实现,无论key还有value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HshTable,效率低,ConcurrentHashMap做了相关优化
ConcurrentHashMsp:底层采用分段的数组}链表实现,线程安全

4.java中的锁
公平锁/非公平锁:
公平锁是指多个线程按照申请锁的顺序来获取锁。
非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取锁。有可能,会造成优先级反转或者饥饿现象。
乐观锁/悲观锁
悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。比如Java里面的同步原语synchronized关键字的实现就是悲观锁。
乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS(Compare and Swap 比较并交换)实现的。
互斥锁/读写锁。
互斥锁在Java中的具体实现就是ReentrantLock;读写锁在Java中的具体实现就是ReadWriteLock。
死锁:两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷入了无限的等待中。

5.线程池的好处和意义
好处:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量线程而导致消耗完内存或者“过度切换”的问题。
意义:效率高,cpu稳定

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值