Java教程

Java多线程--Lock锁

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

Lock锁

Lock与synchronized

继同步代码块和同步方法之后,Lock作为解决线程安全的第三种方式,JDK5.0新增,与synchronized对比如下:
1.Lock是显示锁(手动开启和关闭锁,别忘了关闭锁),synchronized是隐式锁,出了作用域自动释放。

2.Lock只有代码块锁,synchronized有代码块锁和方法锁。

3.使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。并且具有更好的扩展性(提供更多子类)。

优先使用顺序

Lock---->同步代码块(已经进入了方法体,分配了相应资源)---->同步方法(在方法体之外)。

案例

多窗口买票(Lock锁)

 1 import java.util.concurrent.locks.ReentrantLock;
 2 
 3 class Windows implements Runnable{
 4 
 5     private int ticket = 100;
 6 
 7     //true:公平锁,先进先出;不写默认为false,不公平
 8     //1.实例化ReentrantLock
 9     private ReentrantLock lock = new ReentrantLock(true);
10 
11     @Override
12     public void run() {
13         while(true){
14             try{
15                 //2.调用lock()
16                 lock.lock();
17 
18                 if(ticket > 0){
19                     try {
20                         Thread.sleep(100);
21                     } catch (InterruptedException e) {
22                         e.printStackTrace();
23                     }
24                     System.out.println(Thread.currentThread().getName() + ": 售票 :票号为: "+ ticket);
25                     ticket--;
26                 }else {
27                     break;
28                 }
29             }finally{
30                 //3.调用解锁的方法unlock()
31                 lock.unlock();
32             }
33         }
34     }
35 }
36 public class LockTest {
37     public static void main(String[] args) {
38         Windows w = new Windows();
39 
40         Thread t1 = new Thread(w);
41         Thread t2 = new Thread(w);
42         Thread t3 = new Thread(w);
43 
44         t1.setName("窗口1");
45         t2.setName("窗口2");
46         t3.setName("窗口3");
47 
48         t1.start();
49         t2.start();
50         t3.start();
51     }
52 }
这篇关于Java多线程--Lock锁的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!