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类
线程安全的集合和对象
posted on 2018-11-02 17:42 Lv Jianwei 阅读(277) 评论(0) 编辑 收藏 举报