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)

相关推荐

  • Java注解机制之Spring自动装配实现原理详解

    Java中使用注解的情况主要在SpringMVC(Spring Boot等),注解实际上相当于一种标记语言,它允许你在运行时动态地对拥有该标记的成员进行操作.注意:spring框架默认不支持自动装配的,要想使用自动装配需要修改spring配置文件中<bean>标签的autowire属性. 自动装配属性有6个值可选,分别代表不同的含义: byName ->从Spring环境中获取目标对象时,目标对象中的属性会根据名称在整个Spring环境中查找<bean>标签的id属性值.如果

  • 使用Java8中Optional机制的正确姿势

    前言 Java8带来的函数式编程特性对于习惯命令式编程的程序员来说还是有一定的障碍的,我们只有深入了解这些机制的方方面面才能运用自如.Null的处理在JAVA编程中是出了try catch之外的另一个头疼的问题,需要大量的非空判断模板代码,程序逻辑嵌套层次太深.尤其是对集合的使用,需要层层判空. 首先来看下Optional类的结构图: 而如果我们对它不稍假探索, 只是轻描淡写的认为它可以优雅的解决 NullPointException 的问题, 于是代码就开始这么写了 Optional<User

  • Java编程Retry重试机制实例详解

    本文研究的主要是Java编程Retry重试机制实例详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下 1.业务场景 应用中需要实现一个功能: 需要将数据上传到远程存储服务,同时在返回处理成功情况下做其他操作.这个功能不复杂,分为两个步骤:第一步调用远程的Rest服务逻辑包装给处理方法返回处理结果:第二步拿到第一步结果或者捕捉异常,如果出现错误或异常实现重试上传逻辑,否则继续逻辑操作. 2.常规解决方案演化 1)try-catch-redo简单重试模式: 包装正

  • Java monitor机制使用方法解析

    monitor概念 管程,监视器.在操作系统中,存在着semaphore和mutex,即信号量和互斥量,使用基本的mutex进行开发时,需要小心的使用mutex的down和up操作,否则容易引发死锁问题.为了更好的编写并发程序,在mutex和semaphore基础上,提出了更高层次的同步原语,实际上,monitor属于编程语言的范畴,C语言不支持monitor,而java支持monitor机制. 一个重要特点是,在同一时间,只有一个线程/进程能进入monitor所定义的临界区,这使得monito

  • java获取反射机制的3种方法总结

    反射机制的概念: 指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法.这种动态获取信息,以及动态调用对象方法的功能叫java语言的反射机制. 反射机制的应用: 生成动态代理,面向切片编程(在调用方法的前后各加栈帧). 反射机制的原理: 1 首先明确的概念: 一切皆对象----类也是对象. 2 然后知道类中的内容 :modifier constructor field method. 3 其次明白加载: 当Animal.class在硬盘中时

  • 全面了解Java中的CAS机制

    前言 在看到Java锁机制的时候,无意中看到了CAS这个词,然后在百度查找CAS看了很多文章始终没有看的太懂,今天又在Google上查找了一些资料,才算是真正弄清楚了CAS机制. 什么是CAS 在jdk 1.5中增加的一个最主要的支持是Atomic类,比如说AtomicInteger, AtomicLong,这些类可帮助最大限度地减少在多线程中对于一些基本操作(例如,增加或减少多个线程之间共享的值)的复杂性.而这些类的实现都依赖于CAS(compare and swap)的算法. 乐观锁和悲观锁

  • 详解java 三种调用机制(同步、回调、异步)

    1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口 具体说来:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法, 实例1:使用java中Timer来在给定时间间隔发送通知,每隔十秒打印一次数据 Tim

  • 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以后

  • MySQL锁机制与用法分析

    本文实例讲述了MySQL锁机制与用法.分享给大家供大家参考,具体如下: MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁:BDB存储引擎采用的是页面锁,但也支持表级锁:InnoDB存储引擎既支持行级锁,也支持表级锁,但默认情况下采用行级锁. MySQL这3种锁的特性可大致归纳如下: (1)表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低. (2)行级锁:开销大,加锁慢:会出现死锁:

  • 浅谈Java锁机制

    目录 1.悲观锁和乐观锁 2.悲观锁应用 3.乐观锁应用 4.CAS 5.手写一个自旋锁 1.悲观锁和乐观锁 我们可以将锁大体分为两类: 悲观锁 乐观锁 顾名思义,悲观锁总是假设最坏的情况,每次获取数据的时候都认为别的线程会修改,所以每次在拿数据的时候都会上锁,这样其它线程想要修改这个数据的时候都会被阻塞直到获取锁.比如MySQL数据库中的表锁.行锁.读锁.写锁等,Java中的synchronized和ReentrantLock等. 而乐观锁总是假设最好的情况,每次获取数据的时候都认为别的线程不

  • java锁机制ReentrantLock源码实例分析

    目录 一:简述 二:ReentrantLock类图 三:流程简图 四:源码分析 lock()源码分析: 非公平实现: 公平锁实现: tryAcquire()方法 公平锁实现: 非公平锁实现: addWaiter() acquireQueued() shouldParkAfterFailedAcquire() parkAndCheckInterrupt() unlock()方法源码分析: tryRelease() unparkSuccessor() 五:总结 一:简述 ReentrantLock是

  • java编程scanner类用法示例

    在Eclipse中编写程序时,如果我们的变量是需要手动输入的时候,我们就可以用到scanner类了. Scanner类,这是一个用于扫描输入文本的新的实用程序.由于任何数据都必须通过同一模式的捕获组检索或通过使用一个索引来检索文本的各个部分.于是可以结合使用正则表达式和从输入流中检索特定类型数据项的方法.这样,除了能使用正则表达式之外,Scanner类还可以任意地对字符串和基本类型(如int和double)的数据进行分析.借助于Scanner,可以针对任何要处理的文本内容编写自定义的语法分析器.

  • Python并行编程多线程锁机制Lock与RLock实现线程同步

    目录 什么是锁机制? Lock() 管理线程 RLock() 与Lock()的区别 什么是锁机制? 要回答这个问题,我们需要知道为什么需要使用锁机制.前面我们谈到一个进程内的多个线程的某些资源是共享的,这也是线程的一大优势,但是也随之带来一个问题,即当两个及两个以上的线程同时访问共享资源时,如果此时没有预设对应的同步机制,就可能带来同一时刻多个线程同时访问同一个共享资源,即出现竞态,多数情况下我们是不希望出现这样的情况的,那么怎么避免呢? Lock() 管理线程 先看一段代码: import t

  • python多线程高级锁condition简单用法示例

    本文实例讲述了python多线程高级锁condition简单用法.分享给大家供大家参考,具体如下: 多线程编程中如果使用Condition对象代替lock, 能够实现在某个事件触发后才处理数据, condition中含有的方法: - wait:线程挂起,收到notify通知后继续运行 - notify:通知其他线程, 解除其它线程的wai状态 - notifyAll(): 通知所有线程 - acquire和release: 获得锁和解除锁, 与lock类似, - enter和exit使得对象支持

  • Java适配器模式定义与用法示例

    本文实例讲述了Java适配器模式定义与用法.分享给大家供大家参考,具体如下: 将一个类的接口转换成客户想要的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 适配器一共包括3种角色 1.目标:目标是一个接口,该接口是客户想使用的接口 2.被适配者:被适配者是一个已存在的接口或抽象类,这个接口或抽象类需要适配 3.适配器:适配器是一个类,该类实现了目标接口并包含有被适配者的引用,即适配者的指着是对被适配者接口与目标进行适配 package org.zhy.adapte

  • java中this的用法示例(关键字this)

    this是指向本身的隐含的指针,简单的说,哪个对象调用this所在的方法,那么this就是哪个对象. 示例代码: TestThis_1.java 复制代码 代码如下: /* 问题:什么是this * 输出结果: * A@4e44ac6a */ public class TestThis_1 {    public static void main(String[] args) {        A aa = new A();        System.out.println(aa.f());

  • java程序中foreach用法示例

    语法 复制代码 代码如下: for (Object objectname : preArrayList(一个Object对象的列表)) {} 示例 复制代码 代码如下: package com.kuaff.jdk5;import java.util.*; import java.util.Collection; public class Foreach{private Collection c = null; private String[] belle = new String[4]; pub

随机推荐