java 并发编程Lock

1、ReetrantLock基本使用方法


package com.k6k4.java.examples.lock;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Created by k6k4
 */
public class ReetrantLockExample {
    static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    static class MyThread extends Thread {
        Lock lock;

        public MyThread(Lock lock) {
            this.lock = lock;
        }

        public void run() {
            try {
                lock.lock();
                System.out.println("[Thread]" + Thread.currentThread().getName() + "[Time]" + sdf.format(new Date()));
                Thread.sleep(3000);
            } catch (Exception ex) {
                ex.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    }

    public static void main(String[] args) {
        Lock lock = new ReentrantLock();
        Thread threadA = new MyThread(lock);
        Thread threadB = new MyThread(lock);
        threadA.setName("A");
        threadB.setName("B");
        threadA.start();
        threadB.start();

    }

}

输出结果:

[Thread]A[Time]2017-01-22 12:54:24
[Thread]B[Time]2017-01-22 12:54:27

2、Condition实现等待通知


package com.k6k4.java.examples.lock;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Created by k6k4
 */
public class ReetrantLockExample {
    static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    static class MyThread extends Thread {
        Lock lock;

        Condition condition;

        String type;

        public MyThread(Lock lock, Condition condition, String type) {
            this.lock = lock;
            this.condition = condition;
            this.type = type;
        }

        public void run() {
            if ("wait".equals(type)) {
                waitMethod();
            } else {
                signalMethod();
            }
        }

        private void waitMethod() {
            try {
                lock.lock();
                System.out.println("[BeforeWait]" + Thread.currentThread().getName() + "[Time]" + sdf.format(new Date
                        ()));
                condition.await();
                System.out.println("[AfterWait]" + Thread.currentThread().getName() + "[Time]" + sdf.format(new Date
                        ()));
            } catch (Exception ex) {
                ex.printStackTrace();
            } finally {
                lock.unlock();
            }
        }

        private void signalMethod() {
            try {
                lock.lock();
                System.out.println("[BeforeSignal][Thread]" + Thread.currentThread().getName() + "[Time]" + sdf.format
                        (new Date()));
                condition.signal();
                System.out.println("[AfterSignal][Thread]" + Thread.currentThread().getName() + "[Time]" + sdf.format
                        (new
                                Date()));
            } catch (Exception ex) {
                ex.printStackTrace();
            } finally {
                lock.unlock();
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Lock lock = new ReentrantLock();
        Condition condition = lock.newCondition();
        Thread threadA = new MyThread(lock,condition,"wait");
        Thread threadB = new MyThread(lock,condition,"signal");
        threadA.setName("A");
        threadB.setName("B");
        threadA.start();
        Thread.sleep(1000);
        threadB.start();

    }

}


输出结果:


[BeforeWait]A[Time]2017-01-22 12:51:08
[BeforeSignal][Thread]B[Time]2017-01-22 12:51:09
[AfterSignal][Thread]B[Time]2017-01-22 12:51:09
[AfterWait]A[Time]2017-01-22 12:51:09


3、

分享本文