使用同步机制的这种方式解决线程安全问题,但是不知道具体的锁对象在哪里添加,并且锁对象在哪里释放锁对象,对于这种情况Jdk5以后Java提供了一个更具体的锁对象:Lock
Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作
*
Lock是一个接口,所以它在使用的是 ReentrantLock子实现类
*
* public void lock()获取锁。
* public void unlock()试图释放此锁

对象类
package Day21_Lock; import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; /**
* @author Aoman_Hao
*/
public class UseLock implements Runnable{
private int tickets=20;
public int x=0;
//定义一个具体的锁对象
private Lock lock = new ReentrantLock(); @Override
public void run() {
while(true){
try {
lock.lock();
if(tickets>0){
Thread.sleep(100);
System.out.println(Thread.currentThread().getName()+"窗口出售第"+(tickets--)+"张票");
}else{
break;
}
} catch (Exception e) {
}
finally{
//释放锁对象
lock.unlock();
}
} } } 测试类:
package Day21_Lock;
/**
* @author Aoman_Hao
*/
public class LockTest { public static void main(String[] args) {
UseLock UL = new UseLock(); Thread t1 = new Thread(UL, "窗口1");
Thread t2 = new Thread(UL, "窗口2");
Thread t3 = new Thread(UL, "窗口3"); t1.start();
t2.start();
t3.start();
} }
输出:
窗口1窗口出售第20张票
窗口1窗口出售第19张票
窗口1窗口出售第18张票
窗口1窗口出售第17张票
窗口1窗口出售第16张票
窗口2窗口出售第15张票
窗口2窗口出售第14张票
窗口2窗口出售第13张票
窗口3窗口出售第12张票
窗口3窗口出售第11张票
窗口3窗口出售第10张票
窗口3窗口出售第9张票
窗口3窗口出售第8张票
窗口3窗口出售第7张票
窗口3窗口出售第6张票
窗口3窗口出售第5张票
窗口3窗口出售第4张票
窗口3窗口出售第3张票
窗口3窗口出售第2张票
窗口3窗口出售第1张票

使用同步机制可以解决多线程的安全问题,但是自身也会有弊端:
* 1)同步—->执行效率低(每一个线程在抢占到CPU的执行权,会去将(门)关闭,别的线程进不来)
* 2)容易出现死锁现象
*
* 死锁线程:两个或者两个以上的线程出现了互相等待的情况,就会出现死锁!
*

classa:
public class DeadClassA {
public void FirstClassA(){
try {
Thread.sleep(100);
} catch (Exception e) {
System.out.println("进程名:"+Thread.currentThread().getName()+"调用A的First方法内部");
} }
public void LastClassA(){
System.out.println("A的Last方法内部");
}
} classb:
public class DeadClassB {
public void FirstClassB(){
try {
Thread.sleep(100);
} catch (Exception e) {
System.out.println("进程名:"+Thread.currentThread().getName()+"调用B的first方法");
}
} public void LastClassB(){
System.out.println("进入B的Last方法内部");
}
} 对象类:
public class DeadLock implements Runnable { Object obj = new Object();
Object obj2 = new Object();
private boolean flag;//定义一个判断量
public void lockflag(boolean flag){
this.flag=flag;
} @Override
public void run() {
if(flag){
//先调用A类的第一个方法,在调用B类的最后一个方法
synchronized (obj) {
new DeadClassA().FirstClassA();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
new DeadClassB().LastClassB();
}
} }
else{
//先调用B类的第一个方法,在调用A类的最后一个方法
synchronized (obj2) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
new DeadClassB().FirstClassB();
synchronized (obj) {
new DeadClassA().LastClassA();
}
}
} } }
测试类:
public class DeadLockTest { public static void main(String[] args) { DeadLock DL = new DeadLock();
DL.lockflag(true);
Thread T1 = new Thread(DL); DeadLock DL2 = new DeadLock();
DL2.lockflag(false);
Thread T2 = new Thread(DL); T1.start();
T2.start(); } }

Lock同步_小记的更多相关文章

  1. Lock同步锁--线程同步

    Lock-同步锁 Lock是java5提供的一个强大的线程同步机制--通过显示定义同步锁对象来实现同步.Lock可以显示的加锁.解锁.每次只能有一个线程对lock对象加锁. Lock有ReadLock ...

  2. Lock锁_线程_线程域

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  3. BZOJ_1060_时态同步_树形DP

    BZOJ_1060_时态同步_树形DP 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1060 分析:水水的树形DP. 用儿子的最大值更新父亲, ...

  4. JUC--Callable 以及Lock同步锁

    /** * 一.创建执行线程的方式三:实现Callable接口.相较于实现Runnable接口方式,方法可以有返回值,并且可以抛出异常 * 二.callable 需要FutureTask实现类的支持. ...

  5. Lock同步锁

    Lock同步锁 一.前言 在Java 5.0 之前,协调共享对象的访问时可以使用的机制只有synchronized 和volatile .Java 5.0 后增加了一些新的机制,但并不是一种替代内置锁 ...

  6. 7.生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信)

    /* * 生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信) * */ public class TestProductorAndConsumerForLoc ...

  7. [b0039] python 归纳 (二四)_多进程数据共享和同步_锁Lock&RLock

    # -*- coding: utf-8 -*- """ 多进程 锁使用 逻辑: 10个进程各种睡眠2秒,然后打印. 不加锁同时打印出来,总共2秒,加锁一个接一个打印,总共 ...

  8. 深入分析 Java Lock 同步锁

    前言 Java 的锁实现,有 Synchronized 和 Lock.上一篇文章深入分析了 Synchronized 的实现原理:由Java 15废弃偏向锁,谈谈Java Synchronized 的 ...

  9. 锁对象-Lock: 同步问题更完美的处理方式 (ReentrantReadWriteLock读写锁的使用/源码分析)

    Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我 ...

  10. [b0035] python 归纳 (二十)_多进程数据共享和同步_共享内存Value & Array

    1. Code # -*- coding: utf-8 -*- """ 多进程 数据共享 共享变量 Value,Array 逻辑: 2个进程,对同一份数据,一个做加法,一 ...

随机推荐

  1. 苹果怎么查看UDID iPhone/iPad查看UDID教程【详解】

      在开发iPhone和iPad软件的时候,要使用UDID来做真机测试,那么如何查看iPhone或者iPad的UDID呢?下面介绍三种最简单的查看UDID的方法,供大家参考!下面就详情来看看. 1.使 ...

  2. qiankun vue子应用升级webpack5问题记录

    升级的方式是使用最新版本的 vue-cli 脚手架,重新创建一个新项目,然后复制 @vue/cli-xxx , vue 相关依赖最新版本到子应用项目 -> 核对babel, eslint相关配置 ...

  3. js给元素设置样式

    一.style 利用 "[元素].style.[CSS属性名] = [属性值]" 的方法 1 var Box = document.getElementById('box') 2 ...

  4. 深度相机(TOF)的工作原理

    文章目录 深度相机(TOF)的工作原理 TOF由什么组成? 一.TOF相机采用主动光探测,通常包括以下几个部分: 二.TOF是如何测距的呢? 三.TOF会受什么影响? 四.那TOF相机最后输出的是什么 ...

  5. Prism Sample 17-BasicRegionNavigation

    本例是基础的导航应用 在窗口中布局了2个按钮,一个区域 <DockPanel LastChildFill="True"> <StackPanel Orientat ...

  6. #Python基础 利用Pyinstaller 模块对python代码进行打包exe

    一般我们都用 Python 的 Pyinstaller 模块进行打包,这里记录Pyinstaller 模块进行打包. 一:安装 Pyinstaller 模块 pip install PyInstall ...

  7. 使用STM32CubeMX生成ThreadX实时操作系统工程模板

    博客主页:链接.转载请注明出处! 由于需要在stm32上使用USB Host CDC-ECM,连接EC20发送数据到服务器,接触到了ThreadX实时操作系统. 在调研过程中,发现stm32官方USB ...

  8. 第一单元 .Net 平台介绍

    第一单元 .Net 平台介绍 学习编程,电脑基本配置(当然配置越高越好): 内存 :初期学习8 G,后期可能跟不上, 最好16 G以上 硬盘:500 G,5400 转速,至少C盘是固态,全是固态最好 ...

  9. VS code 的安装

    VS code 的安装 Win10环境配置(一)--C\C++篇 Win10环境配置(二) --Java篇 安装前先 ,完成环境的配置 1.工具准备 官网下载:Visual Studio Code 2 ...

  10. [汽车]车架号(VIN)的设计与规范

    1 车架号概述 VIN是英文Vehicle Identification Number(车辆识别代码)的缩写,也就是我们平时所说的车架号.大架号. 总共由17位字符组成,是汽车唯一的身份识别信息,好比 ...