多线程编程步骤

上部
第一步 创建资源类,在资源类创建属性和操作方法。

第二步 在资源类操作方法
判断
干活
通知
第三步 创建多个线程,调用资源类的操作方法。

1 Synchronized

1.1 Synchronized关键字回顾

synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:

  1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
  2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
    o 虽然可以使用synchronized来定义方法,但synchronized并不属于方法定义的一部分,因此,synchronized关键字不能被继承。如果在父类中的某个方法使用了synchronized关键字,而在子类中覆盖了这个方法,在子类中的这个方法默认情况下并不是同步的,而必须显式地在子类的这个方法中加上synchronized关键字才可以。当然,还可以在子类方法中调用父类中相应的方法,这样虽然子类中的方法不是同步的,但子类调用了父类的同步方法,因此,子类的方法也就相当于同步了。
  3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
  4. 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。

    2.什么是Lock

    Lock锁实现提供了比使用同步方法和语句可以获得的更广泛的锁操作。
    他们允许更灵活的结构,可能具有非常不同的属性,并且可能支持多个关联的条件对象。
    Lock提供了比synchronized更多的功能。

Lock锁与Synchronized的区别
(1)Lock不是Java语言内置的,synchronized是Java语言的关键字,因此是内置特性。lock是一个类,通过这个类可以实现同步访问。
(2)Lock需要主动释放锁,synchronized不需要。如果没有主动释放Lock锁,就有可能导致出现死锁现象。

2.1 Lock 接口

  1. public interface Lock {
  2. void lock();
  3. void lockInterruptibly() throws InterruptedException;
  4. boolean tryLock();
  5. boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
  6. void unlock();
  7. Condition newCondition();
  8. }

2.2 Lock

lock() 方法是平常使用的最多的一个方法,就是用来获取锁。如果锁被其他线程获取,则进行等待。
发生异常时,Lock也不会自动释放锁。必须放在try…catch…代码块内使用。

  1. Lock lock = ...;
  2. lock.lock();
  3. try{
  4. //处理任务
  5. }catch(Exception ex){
  6. }finally{
  7. //释放锁
  8. lock.unlock();
  9. }

2.5 小结