2022,01,28Java多线程
2022.01.29多线程每日一考
1.画图说明线程的生命周期,以及各状态切换使用到的方法等
2.同步代码块中涉及到同步监视器和共享数据,谈谈你对同步监视器和共享数据的理解,以及注意点。
同步监视器:用于解决线程安全问题,在多个线程对共享数据进行操作时,保证一个线程操作完后下一个线程才进入。
共享数据:静态变量
注意点synchronize需将共享数据代码刚好完全包裹住
多个线程必须保证使用同一个同步监视器,一般是所在类.Class
synchronized(同步监视器){
//操作共享数据的代码 (不能包括多了,也不能包括少了)
}
3. sleep()和wait()的区别
sleep()用于单个线程的阻塞
不释放同步锁
位于Thread类中
wait()用于多个线程的通信
放弃同步锁(等待notify调用)
位于Object类中
1.相同点:一旦执行方法,都可以使得当前的线程进入阻塞状态。
2.不同点:①两个方法声明的位置不同:Thread类中声明sleep(), Object类中声明wait()
②调用的要求不同:Sleep()可以再任何需要的场景下调用,wait()必须使用在同步代码块或同步方法中;
③关于是否释放同步监视器:如果两个方法都使用在同步代码块或同步方法中,sleep()不会释放锁,wait()会释放锁
4. 写一个线程安全的懒汉式
自己写的:
package www.fancy.security; public class SingleTest { private SingleTest(){ } private static SingleTest sin = null; public static SingleTest CreatSingle(){ synchronized (SingleTest.class) { if( sin == null){ sin = new SingleTest(); } return sin; } } } class Test{ public static void main(String[] args) { SingleTest s1 = SingleTest.CreatSingle(); SingleTest s2 = SingleTest.CreatSingle(); System.out.println(s1 == s2); } }
答案:
class Singleton { private static Singleton instance = null; private Singleton(){} public static Singleton getInstance(){ if(instance==null){ synchronized(Singleton.class){ if(instance == null){ instance=new Singleton(); } } } return instance; } } public class SingletonTest{ public static void main(String[] args){ Singleton s1=Singleton.getInstance(); Singleton s2=Singleton.getInstance(); System.out.println(s1==s2); } }
5. 创建多线程有哪几种方式:4种
继承Thread类
实现Runnable接口
实现Callable接口
线程池(响应速度提高了,提高了资源的重用率,便于管理)
1.相同点:一旦执行方法,都可以使得当前的线程进入阻塞状态。2.不同点:①两个方法声明的位置不同:Thread类中声明sleep(), Object类中声明wait()②调用的要求不同:Sleep()可以再任何需要的场景下调用,wait()必须使用在同步代码块或同步方法中;③关于是否释放同步监视器:如果两个方法都使用在同步代码块或同步方法中,sleep()不会释放锁,wait()会释放锁