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的线程。

  内部锁和条件局限:

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

Volatile域

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

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

 

final变量

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

Atomic类

线程安全的集合和对象

猜你喜欢

转载自www.cnblogs.com/lvjianwei/p/9897541.html