Java教程

Java多线程(五)-线程同步(Lock锁)

本文主要是介绍Java多线程(五)-线程同步(Lock锁),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

六.线程同步(并发)

Lock锁:

通过显式定义锁实现同步。

java.util.concurrent,locks.lock接口是控制多个线程对共享资源进行访问的工具。锁可以对共享资源的独占访问,每次只能有一个线程对lock对象加索,线程开始访问共享资源前先获得lock对象。

ReentrantLock类实现了Lock,拥有于synchronized相同的并发性和内存语义,比较常用。

class A{
    private final ReentrantLock lock = new ReentrantLock();
    public void m() {    
        try {
        	lock.lock();
        	//保证线程安全的代码
        }finally {
        	lock.unlock();
        }
    }
}
点击查看案例
public class Lock {
    public static void main(String[] args) {
        BuyTickett buyTicket = new BuyTickett();
        new Thread(buyTicket,"a").start();
        new Thread(buyTicket,"b").start();
        new Thread(buyTicket,"c").start();
    }
}

class BuyTickett implements Runnable{

    private int ticketNum = 10;
    boolean flag = true;

    private final ReentrantLock lock = new ReentrantLock();

    @Override
    public void run() {
        while (flag){
            try {
                lock.lock();
                try {
                    buy();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }finally {
                lock.unlock();
            }
        }
    }

    private void buy() throws InterruptedException {
        if (ticketNum <= 0){
            flag = false;
            return;
        }
        Thread.sleep(100);
        System.out.println(Thread.currentThread().getName()+"获得了第"+ticketNum--+"张票");
    }
}
运行结果
b获得了第10张票
b获得了第9张票
c获得了第8张票
c获得了第7张票
c获得了第6张票
c获得了第5张票
c获得了第4张票
c获得了第3张票
a获得了第2张票
a获得了第1张票

Lock锁与synchronized对比:

  • lock是显式锁,需手动开启关闭,synchronized隐式锁,出作用域自动关闭
  • Lock锁性能更好
  • (优先级)使用顺序:Lock>同步块>同步方法
这篇关于Java多线程(五)-线程同步(Lock锁)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!