java lock机制_Java锁机制Lock用法示例

本文实例讲述了Java锁机制Lock用法。分享给大家供大家参考,具体如下:

package com.expgiga.JUC;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

/**

* 一、用于解决多线程安全问题的方式:

* 1.同步代码块 synchronized 隐式锁

* 2.同步方法 synchronized 隐式锁

* 3.同步锁Lock (jdk1.5以后) 显示锁

* 注意:显示锁,需要通过lock()方式上锁,必须通过unlock()方式进行释放锁

*/

public class TestLock {

public static void main(String[] args) {

Ticket ticket = new Ticket();

new Thread(ticket, "1号窗口").start();

new Thread(ticket, "2号窗口").start();

new Thread(ticket, "3号窗口").start();

}

}

class Ticket implements Runnable {

private int tick = 100;

private Lock lock = new ReentrantLock();

@Override

public void run() {

while (true) {

lock.lock();

try {

if (tick > 0) {

try {

Thread.sleep(200);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println(Thread.currentThread().getName() + " 完成售票,余票为 " + --tick);

}

} finally {

lock.unlock();

}

}

}

}

运行结果:

1号窗口 完成售票,余票为 99

2号窗口 完成售票,余票为 98

2号窗口 完成售票,余票为 97

2号窗口 完成售票,余票为 96

2号窗口 完成售票,余票为 95

3号窗口 完成售票,余票为 94

1号窗口 完成售票,余票为 93

1号窗口 完成售票,余票为 92

1号窗口 完成售票,余票为 91

1号窗口 完成售票,余票为 90

1号窗口 完成售票,余票为 89

1号窗口 完成售票,余票为 88

1号窗口 完成售票,余票为 87

1号窗口 完成售票,余票为 86

2号窗口 完成售票,余票为 85

3号窗口 完成售票,余票为 84

1号窗口 完成售票,余票为 83

2号窗口 完成售票,余票为 82

3号窗口 完成售票,余票为 81

1号窗口 完成售票,余票为 80

1号窗口 完成售票,余票为 79

1号窗口 完成售票,余票为 78

1号窗口 完成售票,余票为 77

1号窗口 完成售票,余票为 76

1号窗口 完成售票,余票为 75

1号窗口 完成售票,余票为 74

1号窗口 完成售票,余票为 73

1号窗口 完成售票,余票为 72

2号窗口 完成售票,余票为 71

2号窗口 完成售票,余票为 70

2号窗口 完成售票,余票为 69

2号窗口 完成售票,余票为 68

3号窗口 完成售票,余票为 67

1号窗口 完成售票,余票为 66

1号窗口 完成售票,余票为 65

1号窗口 完成售票,余票为 64

1号窗口 完成售票,余票为 63

1号窗口 完成售票,余票为 62

1号窗口 完成售票,余票为 61

2号窗口 完成售票,余票为 60

2号窗口 完成售票,余票为 59

3号窗口 完成售票,余票为 58

3号窗口 完成售票,余票为 57

1号窗口 完成售票,余票为 56

1号窗口 完成售票,余票为 55

2号窗口 完成售票,余票为 54

2号窗口 完成售票,余票为 53

2号窗口 完成售票,余票为 52

3号窗口 完成售票,余票为 51

1号窗口 完成售票,余票为 50

1号窗口 完成售票,余票为 49

1号窗口 完成售票,余票为 48

1号窗口 完成售票,余票为 47

1号窗口 完成售票,余票为 46

1号窗口 完成售票,余票为 45

2号窗口 完成售票,余票为 44

3号窗口 完成售票,余票为 43

3号窗口 完成售票,余票为 42

3号窗口 完成售票,余票为 41

3号窗口 完成售票,余票为 40

3号窗口 完成售票,余票为 39

1号窗口 完成售票,余票为 38

2号窗口 完成售票,余票为 37

2号窗口 完成售票,余票为 36

2号窗口 完成售票,余票为 35

2号窗口 完成售票,余票为 34

2号窗口 完成售票,余票为 33

2号窗口 完成售票,余票为 32

2号窗口 完成售票,余票为 31

3号窗口 完成售票,余票为 30

1号窗口 完成售票,余票为 29

1号窗口 完成售票,余票为 28

1号窗口 完成售票,余票为 27

1号窗口 完成售票,余票为 26

1号窗口 完成售票,余票为 25

1号窗口 完成售票,余票为 24

1号窗口 完成售票,余票为 23

1号窗口 完成售票,余票为 22

1号窗口 完成售票,余票为 21

1号窗口 完成售票,余票为 20

1号窗口 完成售票,余票为 19

1号窗口 完成售票,余票为 18

1号窗口 完成售票,余票为 17

1号窗口 完成售票,余票为 16

1号窗口 完成售票,余票为 15

2号窗口 完成售票,余票为 14

2号窗口 完成售票,余票为 13

2号窗口 完成售票,余票为 12

3号窗口 完成售票,余票为 11

3号窗口 完成售票,余票为 10

3号窗口 完成售票,余票为 9

1号窗口 完成售票,余票为 8

1号窗口 完成售票,余票为 7

1号窗口 完成售票,余票为 6

1号窗口 完成售票,余票为 5

2号窗口 完成售票,余票为 4

3号窗口 完成售票,余票为 3

1号窗口 完成售票,余票为 2

2号窗口 完成售票,余票为 1

2号窗口 完成售票,余票为 0

更多java相关内容感兴趣的读者可查看本站专题:《Java进程与线程操作技巧总结》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的Lock是一种更高级别的线程同步机制,它比传统的synchronized关键字更加灵活,性能也更好。Java中的Lock要求显式地获取锁和释放锁,而synchronized则会自动获取和释放锁。下面介绍一下Lock的使用及其常见的使用场景。 ### Lock的使用 Java中的Lock接口定义了一组方法,用于获取锁、释放锁以及其他一些与锁相关的操作。Lock的常用实现类有ReentrantLock、ReentrantReadWriteLock.ReadLock和ReentrantReadWriteLock.WriteLock等。 下面是一个简单的使用ReentrantLock示例: ```java import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class LockDemo { private Lock lock = new ReentrantLock(); public void method() { lock.lock(); // 获取锁 try { // 这里是需要同步的代码块 } finally { lock.unlock(); // 释放锁 } } } ``` 在上面的示例中,我们使用了ReentrantLock来实现锁的功能。在需要同步的代码块前调用lock()方法获取锁,在同步代码块执行完后调用unlock()方法释放锁。 ### Lock的使用场景 Lock的使用场景与synchronized类似,都是在多线程环境下对共享资源进行同步。但是,由于Lock的灵活性更强,所以它的使用场景比synchronized更加广泛。 下面是一些常见的Lock的使用场景: - 高并发情况下的线程同步:在高并发情况下,使用Lock可以提供更好的性能,因为它的实现比synchronized更加高效。 - 读写分离的情况下的线程同步:在读写分离的情况下,使用ReentrantReadWriteLock可以实现读写锁,使得读操作可以并发执行,而写操作需要独占锁,保证数据的一致性。 - 死锁避免:在使用synchronized时,如果由于某些原因没有及时释放锁,就可能导致死锁。而使用Lock时,可以在获取锁的时候设置超时时间,避免死锁的发生。 总之,LockJava中一种强大的线程同步机制,使用时需要注意锁的获取和释放,以及异常处理等问题,但它的灵活性和性能优势使得它成为Java并发编程中不可或缺的一部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值