为了解决多线程安全问题
在 Java 5.0 之前,协调共享对象的访问时可以使用的机制只有 synchronized 和 volatile 。
Java 5.0 后增加了一些新的机制,但并不是一种替代内置锁的方法,而是当内置锁不适用时,作为一种可选择的高级功能。

隐式锁

synchronized

  1. 同步代码块;
  2. 同步方法。

显示锁 Lock

jdk 1.5 后:同步锁 Lock 需要通过 lock() 方法上锁,必须通过 unlock() 方法进行释放锁。
ReentrantLock 实现了 Lock 接口,并提供了与synchronized 相同的互斥性和内存可见性。但相较于synchronized 提供了更高的处理锁的灵活性。

Lock使用方式:

Lock lock = new ReentrantLock();
lock.lock();
try {
} finally {
lock.unlock();
}

相关API:

  1. void lock() 获取锁。
  2. void lockInterruptibly() 如果当前线程未被中断,则获取锁。
  3. Condition newCondition() 返回绑定到此 Lock 实例的新 Condition 实例。
  4. boolean tryLock() 仅在调用时锁为空闲状态才获取该锁。
  5. boolean tryLock(long time, TimeUnit unit) 如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁。
  6. void unlock()释放锁。

不使用锁出现多线程安全问题demo:

package com.company;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;@Overridepublic void run() {while(true){if(tick > 0){try {Thread.sleep(200);} catch (InterruptedException e) {}System.out.println(Thread.currentThread().getName() + " 完成售票,余票为:" + --tick);}}}}

看出现的问题(截取结果中一部分):

3号窗口 完成售票,余票为:10
1号窗口 完成售票,余票为:8
2号窗口 完成售票,余票为:8
3号窗口 完成售票,余票为:8
2号窗口 完成售票,余票为:7
1号窗口 完成售票,余票为:7
3号窗口 完成售票,余票为:7
1号窗口 完成售票,余票为:6
2号窗口 完成售票,余票为:5
3号窗口 完成售票,余票为:4
3号窗口 完成售票,余票为:3
1号窗口 完成售票,余票为:3
2号窗口 完成售票,余票为:3
3号窗口 完成售票,余票为:2
1号窗口 完成售票,余票为:0
2号窗口 完成售票,余票为:1

现在我们用Lock来进行处理:

package com.company;import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;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();@Overridepublic void run() {while (true) {try {lock.lock();if (tick > 0) {try {Thread.sleep(200);} catch (InterruptedException e) {}System.out.println(Thread.currentThread().getName() + " 完成售票,余票为:" + --tick);}} finally { lock.unlock();}}}}

看下结果(当然也是一部分),很完美解决多线程安全问题:

2号窗口 完成售票,余票为:20
2号窗口 完成售票,余票为:19
2号窗口 完成售票,余票为:18
2号窗口 完成售票,余票为:17
2号窗口 完成售票,余票为:16
2号窗口 完成售票,余票为:15
2号窗口 完成售票,余票为:14
2号窗口 完成售票,余票为:13
2号窗口 完成售票,余票为:12
2号窗口 完成售票,余票为:11
2号窗口 完成售票,余票为:10
2号窗口 完成售票,余票为:9
2号窗口 完成售票,余票为:8
2号窗口 完成售票,余票为:7
2号窗口 完成售票,余票为:6
2号窗口 完成售票,余票为:5
2号窗口 完成售票,余票为:4
2号窗口 完成售票,余票为:3
2号窗口 完成售票,余票为:2
2号窗口 完成售票,余票为:1
2号窗口 完成售票,余票为:0

java多线程 -- 同步鎖相关推荐

  1. java 什么是线程同步,java多线程同步集合是什么?并发集合是什么?

    java中关于集合的内容也是十分丰富的,而且相关的知识点也是十分多的.多线程集合所涵盖的范围是十分广阔的.今天就来为大家介绍一下,java多线程同步集合是什么以及并发集合是什么?一起来看看吧. 首先我 ...

  2. Java多线程同步机制

    一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在 java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个 ...

  3. java多线程同步与死锁_浅析Java多线程中的同步和死锁

    Value Engineering 1基于Java的多线程 多线程是实现并发机制的一种有效手段,它允许编程语言在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间相互独立,且与进程一样拥有独立 ...

  4. Android 价值千万java多线程同步 lt;五CountDownLatch(计数器)和Semaphore(信号量)

    1).Android 价值千万   java线程专题:Wait&notify&join&Yield http://blog.csdn.net/whb20081815/artic ...

  5. Java多线程同步之使用Lock实现车辆入库出库管理

    Java多线程同步之使用Lock实现车辆入库出库管理 个人笔记: 实现:车库有n个车位,现在有m辆车试图进入车库,每辆车停留随机秒数后离开 首先创建一个Garage车库类,Garage有空间属性和最大 ...

  6. (转) Java多线程同步与异步

    Java线程 同步与异步 线程池 1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成 ...

  7. java 多线程同步_浅谈Java多线程(状态、同步等)

    Java多线程是Java程序员必须掌握的基本的知识点,这块知识点比较复杂,知识点也比较多,今天我们一一来聊下Java多线程,系统的整理下这部分内容. 一.Java中线程创建的三种方式: 1.通过继承T ...

  8. java 多线程同步问题_Java多线程同步问题:一个小Demo完全搞懂

    版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.一个简单的Demo引发的血案 关于线程同步问题我们从一个 ...

  9. Java多线程——同步问题

    多线程的同步依靠的是对象锁机制,synchronized关键字的背后就是利用了封锁来实现对共享资源的互斥访问. 下面以一个简单的实例来进行对比分析.实例要完成的工作非常简单,就是创建10个线程,每个线 ...

最新文章

  1. 日常生活小技巧 -- Notepad++一次删除带指定关键字的行
  2. 多个数字数组_1分钟彻底理解JavaScript的数组与函数
  3. Office 365 Outlook Web App 移动设备体验
  4. 2mysql_2.Mysql常用命令行大全
  5. TomTom导航新增IFTTT功能 可连接到车主日常生活设备
  6. install java 8_Install Java 8 on Ubuntu
  7. python-excel写入代码1
  8. 元气骑士机器人旁边建筑_元气骑士机器人的一些经验
  9. 选择 ASP.NET Core Web UI--主线
  10. 华为od统一考试B卷【连续出牌数量】C++ 实现
  11. 见过贪婪的,没见过这么贪婪的
  12. 基于office三件套的一次性权限维持
  13. escape的主要用途
  14. 数学知识整理:二重积分
  15. c语言万年历报错系统,用c语言写万年历应该怎样写?
  16. 基于动态时间规整(DTW)的孤立字语音识别
  17. Chemical Peel Treatment For Acne Scars
  18. 网页插入全屏背景视频
  19. Python 列表、元素、字典
  20. String类的全面总结[java]

热门文章

  1. DFS水题 URAL 1152 False Mirrors
  2. 实现“Please wait...”效果
  3. PE文件格式和ELF文件格式(上)----PE文件
  4. 解决多线程同时读写一个文件的问题
  5. 使用XSLT转换XML数据并传递参数
  6. centos yum install redis
  7. 05_通过sql操作表中的数据_插入修改删除查询
  8. RAC的搭建(一)--安装环境准备
  9. 转 UIAlertView 不显示、屏幕变灰
  10. Tomcat无法启动,报错java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory