码迷,mamicode.com
首页 > 编程语言 > 详细

Java多线程编程4--Lock的使用--公平锁和非公平锁

时间:2016-05-13 03:08:01      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

    公平与非公平锁:锁Lock分为“公平锁”和“非公平锁”,公平锁表示线程获取锁的顺序是按照线程加锁的顺序来分配的,即先来先得的FIFO先进先出顺序。而非公平锁就是一种获取锁的抢占机制,是随机获得锁的,和公平锁不一样的就是先来的不一定先得到锁,这个方式可能造成某些线程一直拿不到锁,结果也就是不公平的了。

1、公平锁实例

public class Service {
    private ReentrantLock lock ;

    public Service(boolean isFair) {
        lock = new ReentrantLock(isFair);
    }

    public void serviceMethod() {
        try {
            lock.lock();
            System.out.println("ThreadName=" + Thread.currentThread().getName()
                    + " 获得锁定");
        } finally {
            lock.unlock();
        }
    }
}
public class Run {
    public static void main(String[] args) throws InterruptedException {
        final Service service = new Service(true);  //改为false就为非公平锁了
        Runnable runnable = new Runnable() {
            public void run() {
                System.out.println("**线程: " + Thread.currentThread().getName()
                        +  " 运行了 " );
                service.serviceMethod();
            }
        };

        Thread[] threadArray = new Thread[10];

        for (int i=0; i<10; i++) {
            threadArray[i] = new Thread(runnable);
        }
        for (int i=0; i<10; i++) {
            threadArray[i].start();
        }
    }
}

**线程: Thread-0 运行了
ThreadName=Thread-0 获得锁定
**线程: Thread-1 运行了
ThreadName=Thread-1 获得锁定
**线程: Thread-4 运行了
**线程: Thread-5 运行了
ThreadName=Thread-4 获得锁定
**线程: Thread-3 运行了
**线程: Thread-7 运行了
**线程: Thread-9 运行了
ThreadName=Thread-5 获得锁定
ThreadName=Thread-3 获得锁定
**线程: Thread-2 运行了
ThreadName=Thread-7 获得锁定
ThreadName=Thread-9 获得锁定
ThreadName=Thread-2 获得锁定
**线程: Thread-6 运行了
ThreadName=Thread-6 获得锁定
**线程: Thread-8 运行了
ThreadName=Thread-8 获得锁定
打印的结果是按照线程加锁的顺序输出的,即线程运行了,则会先获得锁

--------------------------------------------------------------------------

把Run类里的true改为false就为非公平锁了

**线程: Thread-1 运行了
**线程: Thread-4 运行了
ThreadName=Thread-1 获得锁定
**线程: Thread-3 运行了
ThreadName=Thread-4 获得锁定
**线程: Thread-6 运行了
**线程: Thread-5 运行了
**线程: Thread-2 运行了
**线程: Thread-0 运行了
ThreadName=Thread-6 获得锁定
**线程: Thread-7 运行了
ThreadName=Thread-7 获得锁定
**线程: Thread-8 运行了
ThreadName=Thread-8 获得锁定
ThreadName=Thread-3 获得锁定
**线程: Thread-9 运行了
ThreadName=Thread-9 获得锁定
ThreadName=Thread-5 获得锁定
ThreadName=Thread-2 获得锁定
ThreadName=Thread-0 获得锁定
是乱序的,说明先start()启动的线程不代表先获得锁

Java多线程编程4--Lock的使用--公平锁和非公平锁

标签:

原文地址:http://blog.csdn.net/ochangwen/article/details/51340636

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!