《Java多线程编程核心技术_高洪岩 著》读后整理04

2017-05-18  本文已影响0人  Jthan

第4章 Lock的使用

在Java多线程中, 可以使用synchronized关键字来实现线程之间同步互斥,但在JDK1.5中新增加了ReentrantLock类也能达到同样的效果,并且在扩展功能上也更加强大。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 */
public class MyService {

    private Lock lock = new ReentrantLock();

    public void testMethod() {
        lock.lock();
        for (int i = 0; i < 5; i++) 
            System.out.println("ThreadName=" + Thread.currentThread().getName() + (" " + (i + 1)));
        lock.unlock();
    }
}

class MyThread extends Thread {
    private MyService service;

    public MyThread(MyService service) {
        this.service = service;
    }

    @Override
    public void run() {
        service.testMethod();
    }
}

class Run {
    public static void main(String[] args) {
        MyService service = new MyService();
        
        MyThread t1 = new MyThread(service);
        MyThread t2 = new MyThread(service);
        MyThread t3 = new MyThread(service);
        MyThread t4 = new MyThread(service);
        MyThread t5 = new MyThread(service);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t5.start();
    }
}

OUTPUT:
ThreadName=Thread-0 1
ThreadName=Thread-0 2
ThreadName=Thread-0 3
ThreadName=Thread-0 4
ThreadName=Thread-0 5
ThreadName=Thread-2 1
ThreadName=Thread-2 2
ThreadName=Thread-2 3
ThreadName=Thread-2 4
ThreadName=Thread-2 5
ThreadName=Thread-3 1
ThreadName=Thread-3 2
ThreadName=Thread-3 3
ThreadName=Thread-3 4
ThreadName=Thread-3 5
ThreadName=Thread-4 1
ThreadName=Thread-4 2
ThreadName=Thread-4 3
ThreadName=Thread-4 4
ThreadName=Thread-4 5
ThreadName=Thread-1 1
ThreadName=Thread-1 2
ThreadName=Thread-1 3
ThreadName=Thread-1 4
ThreadName=Thread-1 5
import java.util.concurrent.*;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

//在调用condition.await()方法之前需调用lock.lock()代码获得同步监视器
public class MyService3 {
    private Lock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();

    public void await() {
        try {
            lock.lock();
            System.out.println("A");
            condition.await();//等待
            System.out.println("B");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }

    public void single() {
        try {
            lock.lock();
            condition.signal();//唤醒
        } finally {
            lock.unlock();
        }
    }
}

class Run3 {
    public static void main(String[] args) throws InterruptedException {
        final MyService3 service = new MyService3();
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                service.await();
            }
        });
        thread.start();

        System.out.println(Thread.currentThread().getName());
        Thread.sleep(1);

        service.single();
    }
}

Object类中的wait()方法相当于Condition类中的await()方法

Object类中的wait(long timeout)方法相当于Condition类中的`await(long time, TimeUnit unit)方法

Object类中的notify()方法相当于Condition类中的signal()方法。

Object类中的notifyAll()方法相当于Condition类中的signalAll()方法。


getHoldCount(), getQueueLength(), getWaitQueueLength()
lock.getHoldCount();
lock.getQueueLength();

hasQueuedThread(), hasQueuedThreads(), hasWaiters()
lock.hasQueuedThread(threadA);
lock.hasQueuedThreads();
lock.hasWaiters(newConditino);

isFair(), isHeldByCurrentThread(), isLocked()
lock.isFair();
lock.isHeldByCurrentThread();
lock.isLocked();

lockInterruptibly(), tryLock(), tryLock(long timeout,TimeUnit unit)

ReentrantReadWriteLock
...
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
...
lock.writeLock().lock();
lock.readLock().lock();
...
lock.wirteLock().unlock();
lock.readLock().unlock();
上一篇 下一篇

猜你喜欢

热点阅读