使用同步机制的这种方式解决线程安全问题,但是不知道具体的锁对象在哪里添加,并且锁对象在哪里释放锁对象,对于这种情况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. Java SpringBoot 7z 压缩、解压

    Java SpringBoot 7z 压缩.解压 cmd 7z 文件压缩 7z压缩测试 添加依赖 <dependency> <groupId>org.apache.common ...

  2. css中文字与图片对齐

    css中文字与图片对齐 第一种,使用vertical-align:middle .icon{ background-repeat:no-repeat; background-position:cent ...

  3. vite项目优化----- 解决终端optimized dependencies changed. reloading问题

    写在前面网上都说vite要比webpack快,但个人感受,默认情况下, vite项目的启动确实比webpack快,但如果某个界面是首次进入,且依赖比较多/比较复杂的话,那就会比较慢了. 这篇文章就是用 ...

  4. islider.js轮播图

    本篇文章地址:https://www.cnblogs.com/Thehorse/p/11601032.html css #iSlider-effect-wrapper { height: 220px; ...

  5. Visual Basic 6 API压缩数据

    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As ...

  6. define定义常量和宏

     define:预处理指令 使用方法有两种 1.define定义符号 denfine定义常量 2.define定义宏 宏是有参数的,它的参数是替换 常规来说这样写define定义宏没啥问题 但是这样写 ...

  7. #Python 文本包含函数,pandas库 Series.str.contains 函数

    一:基础的函数组成 '''Series.str.contains(pat,case = True,flags = 0,na = nan,regex = True)'''测试pattern或regex是 ...

  8. 2020-12-09:TCP中,慢启动是什么?

    福哥答案2020-12-09: 简单回答:乘法增大. 中级回答:cwnd拥塞窗口.rwnd接收窗口.MSS最大报文段长度.ssthresh慢开始门限.使用慢开始算法后,每经过一个传输轮次(即往返时延R ...

  9. 2021-05-25:给定一个矩阵matrix,值有正、负、

    2021-05-25:给定一个矩阵matrix,值有正.负.0,蛇可以空降到最左列的任何一个位置,初始增长值是0,蛇每一步可以选择右上.右.右下三个方向的任何一个前进,沿途的数字累加起来,作为增长值: ...

  10. Midjourney|文心一格prompt教程[基础篇]:注册使用教程、风格设置、参数介绍、隐私模式等

    Midjourney|文心一格prompt教程[基础篇]:注册使用教程.风格设置.参数介绍.隐私模式等 开头讲一下为什么选择Midjourney和文心一格,首先Midjourney功能效果好不多阐述: ...