Java多线程(PART XXIV)公平锁和非公平锁

来源:互联网 发布:天谕角色数据 编辑:程序博客网 时间:2024/06/06 02:23

公平锁:

公平锁表示线程获取锁的顺序是按照线程加锁的顺序来分配的。

示例代码:

import java.util.concurrent.locks.ReentrantLock;import java.lang.Thread;class MyService{    private ReentrantLock lock;    public MyService(boolean isFair){        super();        lock=new ReentrantLock(isFair);    }    public void serviceMethod(){        try{            lock.lock();            System.out.println("ThreadName="+Thread.currentThread().getName()+"获取锁定");        }finally{            lock.unlock();        }    }}public class RunFair{    public static void main(String[]args){        final MyService myservice=new MyService(true);        Runnable runnable=new Runnable(){            @Override            public void run(){                System.out.println("线程"+Thread.currentThread().getName()+"运行了");                myservice.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();        }    }}

运行结果:

这里写图片描述

结果分析:

执行结果基本成为有序状态,先start的线程先获得锁。

非公平锁:

一种获得锁的抢占机制,是随机获得锁的,和公平锁不一样的地方就是先来的不一定先得到锁,这个方式可能到时某些进程一直拿不到锁,结果也就不公平了。

示例代码:

修改一行代码

final MyService myservice=new MyService(false);

运行结果:

这里写图片描述

结果分析:

此时的结果基本是乱序的,先start的线程不一定先获得锁。