• 多线程(第二天)


    ---恢复内容开始---

    锁定和监视

    只要有实例就会相对有一个锁定。因此不是说因为某个实例的synchronized方法正在执行中,导致无法执行其他的实例的synchronized方法

    线程共享互斥的架构称为监视(monitor),而获取锁定有时也称为“持有监视”(own)

    synchronized阻挡

    只想启动方法里一部分的线程,而非启动整个方法时 则可以启动synchronized阻挡

    synchronized(){

    ....

    }

    则可以把获取锁定的实例传给“表达式”这部分。如果更精密控制共享互斥的范围,则需要使用synchronized阻挡

    synchronized方法和synchronized阻挡

    synchronized void method(){

    、、、

    }

    在功能上,它跟下面这个synchronized阻挡为主的方法有异曲同工之妙

    void method(){

    synchronized(this){

    ..

    }

    }

    换句话说,synchronized实例方法是使用this锁定去做线程的共享互斥

    synchronized类方法和synchronized阻挡

    假设现在有一个synchronized类方法,synchronized有限制同时只能让一个线程执行这个部分跟synchronized实例方法一样。但是利用synchronized类方法的锁定跟利用synchronized实例方法并不相同

    class something{

    static synchronized void methods(){

      。。。。

    }

    }

    在功能上它跟下面方法有异曲同工之妙

    class something{

    static void method(){

    synchronized(something.class)

    }

    }

    换句话说,synchronized类方法是使用该类的类对象的锁定去做线程的共享互斥。something.class是对应something类的java.lang.Class类的实例

    synchronized语句

    Java规格 The Java Language Specification则是把synchronized阻挡叫synchronized语句 (synchronized statement)

    线程的协调

    简单型的共享互斥:当有一个线程正在执行synchronized方法时,其他线程无法执行该方法。

    等候:若该空间有空闲则写入数据,若非空闲则等候直到空出为止

    通知:当该空间已空出,则通知正在等候的线程

    wait 让线程乖乖等候notify  notifyAll  启动等候中线程的方法

    wait set   线程的休息室

    所有实例都有一个wait set   是一个在执行该实例的wait方法时,操作停止的线程的集合

    执行wait方法时 线程便会暂时停止操作 进入wait set 除非

    1.有其他线程以notify方法唤醒该线程

    2.有其他线程以notifyAll唤醒该线程

    3.有其他线程以interrupt方法唤醒该线程

    4.wait方法已经到期

    obj.wait();

    则目前的线程会暂时停止执行,进入 obj的wait set   这个操作称为:线程在obj的wait 

    如果实例方法里还有如下的语句  wait();则其意义同 this.wait();

    故执行wait()的线程就会进入this的wait set 此时 就变成了线程在this上的wait

    如欲执行wait()方法,线程需获取锁定(这是规则),但是当线程进入wait set时 ,已经释放了该实例的锁定。

    wait set

    一个虚拟的概念 它既不是实例的字段 也不是可以获取在实力上wait中线程列表的方法

  • 相关阅读:
    VS2017常用快捷键
    浅谈JS之setTimeout与setInterval
    你真的了解foreach吗?
    IEnumerable和IEnumerator详解
    Cesium坐标系及坐标转换详解
    NPM常用指令
    ASP.NET Web API 2系列(三):查看WebAPI接口的详细说明及测试接口
    【nginx】安装nginx
    【redis】本地连接服务器的redis教程
    Mysql5.7及以上版本 ONLY_FULL_GROUP_BY报错的解决方法
  • 原文地址:https://www.cnblogs.com/sunshine-in/p/4074308.html
Copyright © 2020-2023  润新知