在jdk1.5后新增的ReentrantLock类同样可达到此效果,且在使用上比synchronized更加灵活
相关API:
使用ReentrantLock实现同步
lock()方法:上锁
unlock()方法:释放锁
使用Condition实现等待/通知 类似于 wait()和notify()及notifyAll()
Lock锁底层基于AQS实现,需要自己封装实现自旋锁。

Synchronized —属于JDK 关键字 底层属于 C++虚拟机底层实现
Lock锁底层基于AQS实现-- 变为重量级
Synchronized 底层原理—锁的升级过程
Lock 过程中 注意 获取锁 释放锁

ReentrantLock用法
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**

  • @author zhuimeng
    */
    public class Thread09 implements Runnable {
    private int count = 100;
    private Lock lock = new ReentrantLock();

    @Override
    public void run() {
    while (true) {
    try {
    Thread.sleep(30);
    } catch (Exception e) {

         }try {// 获取锁lock.lock();if (count > 1) {count--;System.out.println(Thread.currentThread().getName() + "," + count);}} catch (Exception e) {e.printStackTrace();} finally {// 释放锁lock.unlock();}}
    

    }

    public static void main(String[] args) {
    Thread09 thread09 = new Thread09();
    Thread t1 = new Thread(thread09);
    Thread t2 = new Thread(thread09);
    t1.start();
    t2.start();
    }
    }

Condition用法
public class Thread10 {
private ReentrantLock lock = new ReentrantLock();
private Condition condition = lock.newCondition();

public static void main(String[] args) {Thread10 thread10 = new Thread10();try {thread10.print();Thread.sleep(3000);thread10.signal();} catch (Exception e) {}
}public void print() {new Thread(() -> {try {// 释放锁 同时当前线程阻塞lock.lock();System.out.println(Thread.currentThread().getName() + ",1");condition.await();System.out.println(Thread.currentThread().getName() + ",2");} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}).start();
}public void signal() {try {lock.lock();condition.signal();} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}
}

}

Lock锁的基本使用相关推荐

  1. 【解决线程安全问题:通过Lock锁对象】

    [解决线程安全问题:通过Lock锁对象] 参考文章: (1)[解决线程安全问题:通过Lock锁对象] (2)https://www.cnblogs.com/zuixinxian/p/9570409.h ...

  2. java:lock锁

    synchronized锁效率比较低,不方便扩展,不能自定义.于是从jdk1.5之后,就引入了lock锁. lock可以手动上锁,手动释放锁,灵活性很高. Lock lock = new Reentr ...

  3. 深入Lock锁底层原理实现,手写一个可重入锁

    synchronized与lock lock是一个接口,而synchronized是在JVM层面实现的.synchronized释放锁有两种方式: 获取锁的线程执行完同步代码,释放锁 . 线程执行发生 ...

  4. Python多线程——LOCK锁

    ''' import threading number=0 def addNumber():global numberfor i in range(1000000):number+=1# 运行时分为计 ...

  5. JUC多线程:synchronized锁机制原理 与 Lock锁机制

    前言: 线程安全是并发编程中的重要关注点,造成线程安全问题的主要原因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方案,当存在多 ...

  6. java 多线程 串行 加锁_java多线程 synchronized 与lock锁 实现线程安全

    如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样 的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 通过卖火车票的例子 火车站要卖票,我们 ...

  7. java多线程安全解决方案_java常用知识:多线程安全问题的解决方法-Lock锁

    jdk1.5后出现的 两个方法: void Lock() void unlock() 使用步骤: 1.在成员位置创建一个ReentrantLock对象 2.在可能出现安全问题的代码前调用Lock接口中 ...

  8. 我是如何一步步的在并行编程中将lock锁次数降到最低实现无锁编程

    在并行编程中,经常会遇到多线程间操作共享集合的问题,很多时候大家都很难逃避这个问题做到一种无锁编程状态,你也知道一旦给共享集合套上lock之后,并发和伸缩能力往往会造成很大影响,这篇就来谈谈如何尽可能 ...

  9. 多线程 流水线 java_Java Lock锁多线程中实现流水线任务

    下面程序代码通过使用Lock锁执行简单的流水线任务: import java.util.concurrent.locks.Condition; import java.util.concurrent. ...

最新文章

  1. 个人品牌的思考--《赢在中国》(2008-04-01)
  2. 8 list切片_P018 python基础:数据类型之列表切片02
  3. oracle nodemanage,Linux 下Weblogic集群搭建-04通过nodemanage进行节点的启动与关闭
  4. 同IP不同端口Session冲突问题
  5. mysql 选择插入语句_带有last_insert_id()的Mysql多行插入 – 选择语句
  6. Asia Yokohama Regional Contest 2018 G题 What Goes Up Must Come Down(树状数组求逆序对)
  7. Jmeter录制app脚本
  8. IO 多路复用之poll总结
  9. input子系统基础之按键5——按键驱动
  10. 1201-统计数字问题
  11. LCD中调色板的概念
  12. 【二叉树迭代版前序遍历】LeetCode 144. Binary Tree Preorder Traversal
  13. javascript获取网址参数
  14. php上搭建dvwa,使用phpstudy在windows上搭建DVWA
  15. Java常见设计模式总结
  16. 基于stc15f2k60s2芯片单片机编程(计算器,不完美)
  17. RHEL7安装配置FTP服务
  18. C语言求sgn函数,sgnx(sgn函数)
  19. 算法题:SOJ1092: 欧几里得算法
  20. 公司的报表工具太难用,我三天撸了个Excel工具,运营小姐姐直呼太好用了,现已开源!!(建议收藏)

热门文章

  1. 怎么学python知乎_你们都是怎么学 Python 的?
  2. 159. Leetcode 122. 买卖股票的最佳时机 II (贪心算法-股票题目)
  3. mac安装opencv
  4. 【数学建模】MATLAB应用实战系列(七十九)-因子分析法(附MATLAB 和Python代码实现)
  5. java 程序片段_20个非常有用的Java程序片段
  6. java 堆栈 对象_在Java中,哪些对象放在堆栈上,哪些放在堆上?
  7. 深度学习100例-卷积神经网络(CNN)识别验证码 | 第12天
  8. 风险监控报表(Word)
  9. flink window实例分析
  10. Flink JAR包上传和运行逻辑