Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

10.4. ReentrantLock 锁

		
package cn.netkiller.test;

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

public class Test {

    private final Lock lock = new ReentrantLock();
    private int count;

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Test test = new Test();
        new Thread(() -> {
            while (true) {
                test.add(1);
                System.out.println(Thread.currentThread().getName() + ": " + test.count);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }, "线程1").start();
        new Thread(() -> {
            while (true) {
                test.add(1);
                System.out.println(Thread.currentThread().getName() + ": " + test.count);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }, "线程2").start();
        new Thread(() -> {
            while (true) {
                test.add(1);
                System.out.println(Thread.currentThread().getName() + ": " + test.count);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }, "线程3").start();

        new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(1000);
                    System.out.println(test.count);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }

        }, "线程1").start();

    }

    public void add(int n) {
        count += n;
    }
}

		
		

没有加锁,线程是无序执行的

		
线程2: 2
线程3: 3
线程1: 1
3
线程2: 4
线程3: 5
线程1: 6
6
线程2: 7
线程1: 8
线程3: 9
线程2: 10
10
线程1: 11
线程3: 12
12
线程1: 14
线程2: 13
线程3: 15
15		
		
		
		
package cn.netkiller.test;

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

public class Test {

    private final Lock lock = new ReentrantLock();
    private int count;

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Test test = new Test();
        new Thread(() -> {
            while (true) {
                test.add(1);
                System.out.println(Thread.currentThread().getName() + ": " + test.count);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }, "线程1").start();
        new Thread(() -> {
            while (true) {
                test.add(1);
                System.out.println(Thread.currentThread().getName() + ": " + test.count);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }, "线程2").start();
        new Thread(() -> {
            while (true) {
                test.add(1);
                System.out.println(Thread.currentThread().getName() + ": " + test.count);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        }, "线程3").start();

        new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(1000);
                    System.out.println(test.count);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }

        }, "线程1").start();

    }

    public void add(int n) {
        lock.lock();
        try {
            count += n;
        } finally {
            lock.unlock();
        }
    }
}		
		
		
		
线程3: 3
线程1: 1
线程2: 2
3
线程1: 4
线程3: 5
线程2: 6
6
线程1: 7
线程3: 8
线程2: 9
9
线程1: 10
线程2: 11
线程3: 12
12