Java锁

2019-03-12  本文已影响0人  whupenger

Thread几个方法

a、start()方法,调用该方法开始执行该线程;
b、stop()方法,调用该方法强制结束该线程执行;
c、join方法,调用该方法等待该线程结束。
d、sleep()方法,调用该方法该线程进入等待。
e、run()方法,调用该方法直接执行线程的run()方法,但是线程调用start()方法时也会运行run()方法,区别就是一个是由线程调度运行run()方法,一个是直接调用了线程中的run()方法

wait()与notify()方法是Object的方法,不是Thread的方法。同时,wait()与notify()会配合使用,分别表示线程挂起和线程恢复

wait()与sleep()的区别,简单来说wait()会释放对象锁而sleep()不会释放对象锁。

线程状态

锁类型

Synchronized

是Java的一个关键字,它能够将代码块(方法)锁起来

  public synchronized void test() {
        // doSomething
    }

synchronized是一种互斥锁,一次只能允许一个线程进入被锁住的代码块
synchronized是一种内置锁/监视器锁,Java中每个对象都有一个内置锁(监视器,也可以理解成锁标记),而synchronized就是使用对象的内置锁(监视器)来将代码块(方法)锁定的

Lock

Lock完全用Java写成,在java这个层面是无关JVM实现的。在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLockReadWriteLock(实现类ReentrantReadWriteLock),其实现都依赖java.util.concurrent.AbstractQueuedSynchronizer类,实现思路都大同小异,因此我们以ReentrantLock作为讲解切入点

  private final Sync sync;

    abstract static class Sync extends AbstractQueuedSynchronizer
 public void lock() {
        sync.lock();
    }

 public boolean tryLock(long timeout, TimeUnit unit)
            throws InterruptedException {
        return sync.tryAcquireNanos(1, unit.toNanos(timeout));
    }

使用lock显示加锁,可以判断锁的状态,有多种获取锁的方式,获取失败的线程不一定需要阻塞

 //需要参与同步的方法
    private void method(Thread thread){
        lock.lock();
        try {
            System.out.println("线程名"+thread.getName() + "获得了锁");
        }catch(Exception e){
            e.printStackTrace();
        } finally {
            System.out.println("线程名"+thread.getName() + "释放了锁");
            lock.unlock();
        }
    }

AQS,抽象队列同步器

AQS即AbstractQueuedSynchronizer的缩写,是并发编程中实现同步器的一个框架,它在内部定义了一个int state变量,用来表示同步状态
AQS基于一个FIFO双向队列实现,被设计给那些依赖一个代表状态的原子int值的同步器使用,在AQS中即为一个叫state的int值,该值通过CAS进行原子修改。

上一篇下一篇

猜你喜欢

热点阅读