• java 多线程同步


     

    线程属性:

    1.线程优先级,

      优先级高度依赖于系统,不要让程序的正确性依赖于优先级。默认情况子线程会继承父线程的优先级。

    2.守护线程,

      唯一用途是为其他线程提供服务,当只剩下守护线程时,虚拟机就退出了。守护线程应该永远不 访问固有资源,如文件、数据库,因为会在任何时候发生中断。

    3.未捕获异常处理,

      线程的run方法不能抛出任何受检查异常,非受检查异常会导致线程终止,但是不需要catch处理,这类异常在线程死亡前,会被传递到一个用于未捕获异常的处理器。

      如果不安装默认处理器,默认处理器为空,出现异常时,会使用对应的ThreadGroup对象作为处理器。

    4.线程组,

      是一个可以统一管理的线程集合,默认情况,创建的所有线程属于相同的线程组。建议不要使用线程组,使用线程集合。

    并发处理的要求:

    同步

      RentranLock类,锁机制是最常用的同步方式,确保任何时刻只有一个线程进入临界区

    • 把解锁操作放在finally子句之内,保证最后可以将锁释放。
    • 不要使用带资源的try语句(try-with-resources),因为带资源的try语句的声明中需要new新的资源对象,锁将无法起作用。
    • 锁是可重入的,持有计数器(hold count)会跟踪嵌套,因此被锁保护的代码可以调用另一个使用相同锁的方法。
    • 条件等待,条件Condition类,当不满足条件时,调用await()方法进入该条件的等待集,当有其他方法调用该条件的signalAll()方法时,会激活等待该条件的所有线程。signalAll不会立即激活等待线程,只是解除其阻塞状态,可以被调用。singal方法是随机解除某个线程的阻塞状态,被解锁的线程依然有可能无法使用。

    synchronized关键字

      可以用于修饰对象方法、类方法,相当于自动加锁。 

      public synchronized void method()

      {

        do something;

      } 

      等价于

      public void method()

    {

      this.intrinsicLock.lock();

      try

    {

    do something;

    }

    finally

    {

      this.intrinsicLock.unLock();

    }

    }

      synchronized使用了对象的内部锁,并且该锁有一个内部条件。由锁管理试图进入synchronized方法的线程,由条件来管理调用wait的线程。

      内部锁和条件局限:

    • 不能中断一个正在试图获得锁的线程,不能像sleep和wait可以获得中断信号。
    • 试图获得锁时不能设置超时。
    • 每个锁仅有一个单一条件,可能不够。

    Volatile域

      被声明为volatile的域,编译器和虚拟机就会知道该域可能被另一个线程并发更新。提供了对象的可见性,但是不能提供原子性。

      这种机制可以不通过锁的方式,保证更新对象的可见性。

     

    final变量

      final变量修饰的域,需要在构造函数完成后才会被读到,保证了其他线程看到的都相同。

    Atomic类

    线程安全的集合和对象

  • 相关阅读:
    转职游戏策划第四周
    转职游戏策划第三周
    HTML表单验证库SMValidator
    win7通过easyBCD引导ubuntu
    SWF混淆工具(智能提取需要混淆的字段)
    图文混排组件(RichTextField)
    windows下gvim使用vundle插件
    AirMVC
    再战中原之地图编辑器
    再战中原之菜单系统
  • 原文地址:https://www.cnblogs.com/lvjianwei/p/9897541.html
Copyright © 2020-2023  润新知