zoukankan      html  css  js  c++  java
  • 并发经验

    1.保持可运行线程数量尽可能的少的主要技术是,让每个线程做少量的工作,然后使用Object.wait等待某个条件发生,或者使用Thread.sleep()睡眠一段时间,线程不应该忙-等busy-wait,即反复的检查一个数据结构,以等待某些事件发生。除了使程序易受调度器的变化的影响外,忙等这种做法还会增加处理器的负担.

    2.永远不要在循环外面调用wait .

     wait的标准模式:

    synchronized(obj){  

          while(<condition does not hold>)  

                obj.wait();  

          ...//perform action appropriate to condition  

    }  

    3.interrupt()不会中断正在执行的线程,只是将线程的标志位设置成true。但是如果线程在调用sleep(),join(),wait()方法时线程被中断,则这些方法会抛出InterruptedException,在catch块中捕获到这个异常时,线程的中断标志位已经被设置成false了,因此在此catch块中调用t.isInterrupted(),Thread.interrupted()始终都为false,
    而t.isInterrupted与Thread.interrupted()的区别是API中已经说明很明显了,Thread.interrupted()假如当前的中断标志为true,则调完后会将中断标志位设置成false

    --------------------------------------------------------------------

    以上为今天看的前辈们并发相关的博文,仔细分析后摘录下来的经验之谈。

    补充:

    busy-wait模式:

    while(true){

      if(A&&B){

        System.out.println("busy...waiting");

      }

      System.out.println("end...busy");

    }

    但有时候,busy-wait模式也有适用的时候,比如Java自旋锁在线程竞争锁时的“自旋机制”,还有在jdk1.5以后提供的java.util.concurrent.atomic包,该包里面提供了一组原子类,该原子类也有对busy-wait模式的使用,

    比如,AtomicBoolean:

    (jdk1.8源码,其他版本或许有不同之处)

    public final boolean getAndSet(boolean newValue) {
    boolean prev;
    do {
    prev = get();
    } while (!compareAndSet(prev, newValue));
    return prev;
    }

    此处,使用(!compareAndSet(prev, newValue))来控制busy-wait模式.

  • 相关阅读:
    MVVM绑定 填坑,必须在与 DependencyObject 相同的线程上创建 DependencySource
    备份一个迭代查找TreeViewItem的辅助函数
    备份一个集合分组的算法
    备份一个有的时候,可能需要把其它exe或者dll包含在主程序中....
    wpf 代码判断当前是否在设计模式,兼容没有UI线程的限制
    wpf 打开输入法、禁用输入法
    xunit vs2019扩展
    .net core使用nacos作为配置中心
    使用skywalking跟踪你的请求
    帮你做codereview:使用docker安装sonarqube并扫描你的.net core元源码
  • 原文地址:https://www.cnblogs.com/zqsky/p/7158297.html
Copyright © 2011-2022 走看看