1、手写一个懒汉式的单例模式&解决其线程安全问题,并且说明为什么这样子去解决
class Mythread extends Thread{
private static Mythread mythread;
private Mythread() {
}
public static Mythread getInstance() throws InterruptedException {
synchronized (Mythread.class){
if (mythread == null){
mythread = new Mythread();
}
return mythread;
}
}
}
在获取对象时加锁,使得在获取对象时,线程资源不被抢走。从而避免创建多个对象的情况。
2、wait()和sleep()有什么区别?调用这两个函数后,线程状态分别作何改变?
(1)wait()方法是用于线程之间进行通信的,而sleep()方法是用于暂停程序执行的。
(2)在调用wait()方法后,线程会释放它所持有的对象锁,而sleep()方法不会释放任何锁或资源。
(3)wait()方法需要在同步块中调用,而sleep()方法可以在任何地方调用。
3、Java中notify()和notifyAll()有什么区别
多个线程等待同一个对象锁,且notify()方法只随机唤醒其中的一个线程,可能导致其他线程仍然处于等待状态,从而出现竞争条件。
4、为什么wait()和notify()方法要在同步块中调用
它们需要获取对象的锁才能执行
5、 什么是死锁,产生死锁的原因及必要条件
死锁是指两个或多个线程在互相等待对方释放锁时,都无法继续执行,从而导致程序无法正常运行的一种并发问题。
- 互斥条件:一个资源只能被一个线程占用,其他线程必须等待该资源释放后才能占用。
- 请求和保持条件:一个线程可以持有一个资源,并继续请求其他资源,而这些资源可能被其他线程占用,并且其他线程不会释放这些资源,从而导致线程等待。
- 不剥夺条件:线程已经获得的资源不能被其他线程剥夺,只能由持有该资源的线程自行释放。
- 循环等待条件:存在一个线程的等待链,使得这个等待链中的每个线程都在等待下一个线程所持有的资源。
6、 多线程共用一个数据变量需要注意什么?
线程安全问题:由于多个线程同时访问同一个数据变量,可能会出现并发问题,例如数据竞争、死锁、数据不一致等。因此,需要采取相应的措施来保证线程安全,例如使用同步机制、使用线程安全的数据结构等。
7、synchronized加在静态方法和普通方法区别?
- 锁对象不同:对于普通方法,锁对象是当前对象实例(即this),而对于静态方法,锁对象是当前类的Class对象。
- 影响范围不同:对于普通方法,synchronized关键字只对当前对象实例中的synchronized方法或代码块起作用,而对于静态方法,synchronized关键字作用于整个类的所有实例。
- 性能影响不同:由于锁对象不同,synchronized修饰静态方法的性能开销可能会比修饰普通方法更大,因为需要获取类级别的锁。而修饰普通方法的锁对象是当前对象实例,相对来说更容易获取。