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()会释放锁

posted @ 2022-01-29 11:18  Fancy[love]  阅读(34)  评论(0编辑  收藏  举报