java多线程 -- 同步鎖
为了解决多线程安全问题
在 Java 5.0 之前,协调共享对象的访问时可以使用的机制只有 synchronized 和 volatile 。
Java 5.0 后增加了一些新的机制,但并不是一种替代内置锁的方法,而是当内置锁不适用时,作为一种可选择的高级功能。
隐式锁
synchronized
- 同步代码块;
- 同步方法。
显示锁 Lock
jdk 1.5 后:同步锁 Lock 需要通过 lock() 方法上锁,必须通过 unlock() 方法进行释放锁。
ReentrantLock 实现了 Lock 接口,并提供了与synchronized 相同的互斥性和内存可见性。但相较于synchronized 提供了更高的处理锁的灵活性。
Lock使用方式:
Lock lock = new ReentrantLock(); lock.lock(); try { } finally { lock.unlock(); }
相关API:
- void lock() 获取锁。
- void lockInterruptibly() 如果当前线程未被中断,则获取锁。
- Condition newCondition() 返回绑定到此 Lock 实例的新 Condition 实例。
- boolean tryLock() 仅在调用时锁为空闲状态才获取该锁。
- boolean tryLock(long time, TimeUnit unit) 如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁。
- 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多线程 -- 同步鎖相关推荐
- java 什么是线程同步,java多线程同步集合是什么?并发集合是什么?
java中关于集合的内容也是十分丰富的,而且相关的知识点也是十分多的.多线程集合所涵盖的范围是十分广阔的.今天就来为大家介绍一下,java多线程同步集合是什么以及并发集合是什么?一起来看看吧. 首先我 ...
- Java多线程同步机制
一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在 java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个 ...
- java多线程同步与死锁_浅析Java多线程中的同步和死锁
Value Engineering 1基于Java的多线程 多线程是实现并发机制的一种有效手段,它允许编程语言在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间相互独立,且与进程一样拥有独立 ...
- Android 价值千万java多线程同步 lt;五CountDownLatch(计数器)和Semaphore(信号量)
1).Android 价值千万 java线程专题:Wait¬ify&join&Yield http://blog.csdn.net/whb20081815/artic ...
- Java多线程同步之使用Lock实现车辆入库出库管理
Java多线程同步之使用Lock实现车辆入库出库管理 个人笔记: 实现:车库有n个车位,现在有m辆车试图进入车库,每辆车停留随机秒数后离开 首先创建一个Garage车库类,Garage有空间属性和最大 ...
- (转) Java多线程同步与异步
Java线程 同步与异步 线程池 1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成 ...
- java 多线程同步_浅谈Java多线程(状态、同步等)
Java多线程是Java程序员必须掌握的基本的知识点,这块知识点比较复杂,知识点也比较多,今天我们一一来聊下Java多线程,系统的整理下这部分内容. 一.Java中线程创建的三种方式: 1.通过继承T ...
- java 多线程同步问题_Java多线程同步问题:一个小Demo完全搞懂
版权声明:本文出自汪磊的博客,转载请务必注明出处. Java线程系列文章只是自己知识的总结梳理,都是最基础的玩意,已经掌握熟练的可以绕过. 一.一个简单的Demo引发的血案 关于线程同步问题我们从一个 ...
- Java多线程——同步问题
多线程的同步依靠的是对象锁机制,synchronized关键字的背后就是利用了封锁来实现对共享资源的互斥访问. 下面以一个简单的实例来进行对比分析.实例要完成的工作非常简单,就是创建10个线程,每个线 ...
最新文章
- 日常生活小技巧 -- Notepad++一次删除带指定关键字的行
- 多个数字数组_1分钟彻底理解JavaScript的数组与函数
- Office 365 Outlook Web App 移动设备体验
- 2mysql_2.Mysql常用命令行大全
- TomTom导航新增IFTTT功能 可连接到车主日常生活设备
- install java 8_Install Java 8 on Ubuntu
- python-excel写入代码1
- 元气骑士机器人旁边建筑_元气骑士机器人的一些经验
- 选择 ASP.NET Core Web UI--主线
- 华为od统一考试B卷【连续出牌数量】C++ 实现
- 见过贪婪的,没见过这么贪婪的
- 基于office三件套的一次性权限维持
- escape的主要用途
- 数学知识整理:二重积分
- c语言万年历报错系统,用c语言写万年历应该怎样写?
- 基于动态时间规整(DTW)的孤立字语音识别
- Chemical Peel Treatment For Acne Scars
- 网页插入全屏背景视频
- Python 列表、元素、字典
- String类的全面总结[java]
热门文章
- DFS水题 URAL 1152 False Mirrors
- 实现“Please wait...”效果
- PE文件格式和ELF文件格式(上)----PE文件
- 解决多线程同时读写一个文件的问题
- 使用XSLT转换XML数据并传递参数
- centos yum install redis
- 05_通过sql操作表中的数据_插入修改删除查询
- RAC的搭建(一)--安装环境准备
- 转 UIAlertView 不显示、屏幕变灰
- Tomcat无法启动,报错java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory