Lock同步_小记
来源:互联网 发布:win7开机优化加速软件 编辑:程序博客网 时间:2024/06/05 19:16
使用同步机制的这种方式解决线程安全问题,但是不知道具体的锁对象在哪里添加,并且锁对象在哪里释放锁对象,对于这种情况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(); }}
阅读全文
0 0
- Lock同步_小记
- 浅谈C# 中的lock 方法与Monitor 类的关系_以及同步与互斥
- 线程同步---同步锁(Lock)
- C#lock线程同步
- 关于线程同步(Lock)
- 同步,线程通信,lock
- 同步线程1(lock)
- JAVA_同步和Lock
- 多线程同步(Lock)
- 线程同步Lock
- java同步:Lock
- 同步锁 Lock
- PALM同步小记
- 线程同步问题小记
- 正则表达式_小记
- 集合_小记
- 链表_小记
- 泛型_小记
- C++Primer第五版中的c++11特性归纳(四)
- Python3 去掉bs4爬取信息中的‘\t’'\r' '\r'
- Problem1:twoSum
- 音频参数解析
- SSL_1194 最优乘车
- Lock同步_小记
- 证券投资基金名词解释
- 2017年12月7号---我的第一篇博客
- 如何更改MIDI OUT通道的音色
- 405
- hadoop hdfs+mapReduce基本使用命令
- 1366
- Excel2007表格行列切换技巧
- Webpack 删除重复文件的一种优化思路