博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈sleep方法和wait方法的异同
阅读量:4081 次
发布时间:2019-05-25

本文共 1062 字,大约阅读时间需要 3 分钟。

   在我学到多线程技术这里时,感到sleep方法和wait方法二者给我造成了一些困惑,所以我在此将二者小小地总结

一下,希望对大家有所帮助。



  
sleep方法和wait方法异同点是什么?

 相同点:

             二者都可以让线程处于冻结状态。


 不同点:

            首先应该明确sleep方法是Thread类中定义的方法,而wait方法是Object类中定义的方法。

1,sleep方法必须人为地为其指定时间。

     wait方法既可以指定时间,也可以不指定时间。


2,sleep方法时间到,线程处于临时阻塞状态或者运行状态。

     wait方法如果没有被设置时间,就必须要通过notify或者notifyAll来唤醒。


3,sleep方法不一定非要定义在同步中。

    wait方法必须定义在同步中。


4,当二者都定义在同步中时,

     线程执行到sleep,不会释放锁。

      线程执行到wait,会释放锁。

针对以上4点,这里举一个小例子:

[java] 
 
  1. synchronized(obj)  
  2.   
  3.     {  
  4.         wait();//0 1 2  
  5.             code....  
  6.         }  
  7. synchronized(obj)  
  8.   
  9.         {   
  10.             notifyAll();//3  
  11.             code....  
  12.         }  

假设此时在wait方法上可能有多个线程例如Thread0、Thread1、Thread2,他们都被存储到了线程池中,同时将

锁放掉。与此同时,Thread3开始执行下方的同步代码块,当Thread3执行到notifyAll时,0、1、2三个线程都将被唤

醒。此时,在同步中就同时存在多个线程,那么此时会引发多线程的安全问题吗?


答案是不会的,因为在同步中的线程如果想要执行,不但要有执行权,还必须要持有锁,而此时锁在Thread3手

中,所以只有当Thread3执行完代码释放了锁后,其他线程才有机会拿到锁继续执行。

       

看到这里我们可以拓展出一个问题:当一个线程进入一个对象的一个synchronized方法后,其他线程是否可

以进入此对象的其他方法?

这个问题的答案分为以下几种情况:


1.其他方法前是否加了synchronized关键字,如果没加,则能。


2.如果这个方法内部调用了wait,则可以进入其他synchronized方法。


3.如果其他的方法都加了synchronized关键字,并且内部没有调用wait,则不能。


4.如果其他方法是static,它用的同步锁是当前类的字节码,与非静态的方法不能同步,因为非静态的方法用的同

步锁是this。


             个人感觉,在学习多线程这部分的知识时,弄清楚何时拿锁,何时放锁,是极为重要的。

转载地址:http://kjtni.baihongyu.com/

你可能感兴趣的文章
斯坦福大学机器学习——因子分析(Factor analysis)
查看>>
【IntelliJ IDEA】idea导入项目只显示项目中的文件,不显示项目结构
查看>>
ssh 如何方便的切换到其他节点??
查看>>
Java实现DES加密解密
查看>>
HTML基础
查看>>
Java NIO
查看>>
Java大数据:Hbase分布式存储入门
查看>>
大数据学习:Spark RDD操作入门
查看>>
大数据框架:Spark 生态实时流计算
查看>>
大数据入门:Hive和Hbase区别对比
查看>>
大数据入门:ZooKeeper工作原理
查看>>
大数据入门:Zookeeper结构体系
查看>>
大数据入门:Spark RDD基础概念
查看>>
大数据入门:SparkCore开发调优原则
查看>>
大数据入门:Java和Scala编程对比
查看>>
大数据入门:Scala函数式编程
查看>>
【数据结构周周练】002顺序表与链表
查看>>
C++报错:C4700:使用了非初始化的局部变量
查看>>
C++类、结构体、函数、变量等命名规则详解
查看>>
C++ goto语句详解
查看>>