6、JUC

显示锁 Lock

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

ReentrantLock 实现了 Lock 接口,并提供了与
synchronized 相同的互斥性内存可见性。但相较于
synchronized 提供了更高的处理锁的灵活性

解决多线程安全的方法:

1、同部代码块(synchronized )隐式

2、同部方法(synchronized )隐式

3、同步锁(Lock)显示

注意:需要通过过**lock()**方法上锁

必须通过**unlock()**方法进行释放锁

实例:

卖票问题

1public class TestLock { 2 public static void main(String[] args) { 3 4 Ticket t = new Ticket(); 5 6 new Thread(t,"1窗口").start(); 7 new Thread(t,"2窗口").start(); 8 new Thread(t,"3窗口").start(); 9 } 10 11} 12class Ticket implements Runnable{ 13 14 private int ticket = 100; 15 16 @Override 17 public void run() { 18 while(true){ 19 if(ticket >0){ 20 21 try { 22 Thread.sleep(400); 23 } catch (InterruptedException e) { 24 // TODO Auto-generated catch block 25 e.printStackTrace(); 26 } 27 28 System.out.println(Thread.currentThread().getName() + "进行卖票,剩余:" + --ticket); 29 30 } 31 } 32 } 33}

此时的线程是不安全的

 对代码尽心修改:

1import java.util.concurrent.locks.Lock; 2import java.util.concurrent.locks.ReentrantLock; 3 4public class TestLock { 5 public static void main(String[] args) { 6 7 Ticket t = new Ticket(); 8 9 new Thread(t,"1窗口").start(); 10 new Thread(t,"2窗口").start(); 11 new Thread(t,"3窗口").start(); 12 } 13} 14class Ticket implements Runnable{ 15 16 private int ticket = 100; 17 private Lock lock = new ReentrantLock(); 18 19 @Override 20 public void run() { 21 while(true){ 22 //上锁 23 lock.lock(); 24 try { 25 if(ticket >0){ 26 try { 27 Thread.sleep(400); 28 } catch (InterruptedException e) { 29 // TODO Auto-generated catch block 30 e.printStackTrace(); 31 } 32 System.out.println(Thread.currentThread().getName() + "进行卖票,剩余:" + --ticket); 33 } 34 } finally { 35 //释放锁 36 lock.unlock(); 37 } 38 } 39 } 40}

此时可以有效的解决多线成的安全性问题

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

KVM调整cpu和内存

一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid