class Resource {
private boolean flag = false;
private String name;
private int count;
//资源锁
Lock lock = new ReentrantLock();
//监视器类
Condition produce_con = lock.newCondition();
Condition customer_con = lock.newCondition();

public void set(String name){
//获取锁
lock.lock();
try{
while(flag)
//生产者线程等待
try{produce_con.await();}catch(Exception e){}
//直接唤醒消费者线程
customer_con.signal();
flag = true;
count++;
this.name = name;
System.out.println(this.name+" "+this.count);
}
finally{
//释放锁,不管try中代码是否报错,记得释放锁。
lock.unlock();
}

}

public void get(){
//获取锁
lock.lock();
try{
while(!flag)
//消费者线程等待
try{customer_con.await();}catch(Exception e){}
//直接唤醒生产者线程
produce_con.signal();
flag = false;
System.out.println(this.name+" customer"+this.count);
}
finally{
//释放锁资源
lock.unlock();
}

}

}
class Producer implements Runnable{
Resource s;
private Producer(){};

Producer(Resource t){
this.s = t;
}
public void run(){
int i = 0;
while(true){
if(i ==0)
s.set("rastduck");
else
s.set("car");
i = (i+1) %2;
}
}
}
class Customer implements Runnable{

Resource s;
private Customer(){}
Customer(Resource t){
this.s = t;
}
public void run(){
while(true){
s.get();
}
}

}

class LockDemo{
public static void main (String[] arg){
Resource s = new Resource();

Customer c = new Customer(s);
Producer p = new Producer(s);
Thread t1 = new Thread(c);
Thread t2 = new Thread(c);
Thread t3 = new Thread(p);
Thread t4 = new Thread(p);

t1.start();
t2.start();
t3.start();
t4.start();

}
}

转载于:https://www.cnblogs.com/chzlh/p/9371541.html

LockDemo 锁对象相关推荐

  1. 【解决线程安全问题:通过Lock锁对象】

    [解决线程安全问题:通过Lock锁对象] 参考文章: (1)[解决线程安全问题:通过Lock锁对象] (2)https://www.cnblogs.com/zuixinxian/p/9570409.h ...

  2. 【Java 并发编程】线程锁机制 ( 线程安全 | 锁机制 | 类锁 | 对象锁 | 轻量级锁 | 重量级锁 )

    文章目录 一.线程安全 二.锁机制 ( 类锁 | 对象锁 ) 三.锁分类 ( 轻量级锁 | 重量级锁 ) 一.线程安全 多个线程同时访问 同一个共享变量 时 , 只要能保证 数据一致性 , 那么该变量 ...

  3. Synchronize锁对象

    Synchronize锁对象 可以对任意的Object对象,进行加锁 用法比较灵活 package com.bjsxt.base.sync006;/*** 使用synchronized代码块加锁,比较 ...

  4. ABAP 锁对象与加锁机制

    激活锁定对象时,产生的 FM 的名字是什么? 答案:首先要在 ABAP 字典中创建锁对象,然后才能在 ABAP 程序中设锁.创建锁对象时,系统会自动生成两个 FM 来进行锁管理.用于设锁的 FM 为: ...

  5. 更新自定义表时的通用锁对象

    更新自定义表时,可以使用通用的锁对象,而不用再为每一个自定义表创建锁对象(尽管SAP支持这种做法),当然解锁也有通用的解锁对象.代码如下: * 给自定义表 ZCOL2001 加锁对象 CALL FUN ...

  6. notify()唤醒线程,不会立即释放锁对象,需要等到当前同步代码块都执行完后才能释放锁对象

    notify()唤醒线程,不会立即释放锁对象,需要等到当前同步代码块都执行完后才能释放锁对象 public class Test3 {public static void main(String[] ...

  7. java线程同步——竞争条件的荔枝+锁对象

    [0]README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java线程同步--竞争条件的荔枝+锁对象 的相关知识: 0.2) for full sou ...

  8. Java线程(七):锁对象Lock-同步问题更完美的处理方式 .

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

  9. 3.12 SE11创建锁对象

    3.12 SE11创建锁对象 命名规则:<EZ><模块代码><3位流水号> 举例说明:EZWM001 业务说明:锁对象是对数据的访问进行并发的控制.加锁就是将用户正 ...

最新文章

  1. 矩阵专职_新的篇章开始了-我将以专职技术作家的身份加入RunCloud
  2. 学习javascript数据结构(三)——集合
  3. Coursera公开课笔记: 斯坦福大学机器学习第四课“多变量线性回归(Linear Regression with Multiple Variables)”
  4. 全球及中国七氟二甲基辛二酸铜(II)行业竞争策略与投资前景研究报告2022版
  5. mysql 查找字符位置_MySQL数据库中如何查看一个字符串在另一个字符串中第一次出现的位置呢?...
  6. spring autoproxy by annotation
  7. [转]Qtopia2.2.0移植
  8. python云计算架构开发_云计算开发一般负责什么工作呢?更偏向于运维么?
  9. 祝贺Terrylee博客园Post达到100篇
  10. 收购YY直播,百度重返高位的关键布局
  11. 模块化思想——粤嵌GEC6818读取图片宽度、高度、色深
  12. [LeetCode] 204. Count Primes
  13. ajax表单提交post(错误400) 序列化表单(post表单转换json(序列化))
  14. 智能ai电话机器人源码加密开源版开发供应商
  15. pika详解(四) channel 通道
  16. Classic Shell给你的Win8/7装上更好用的开始菜单
  17. 论语读后感--论语与管理
  18. HP收购3com给网络世界带来的变化
  19. 经典的三角形软件测试用例
  20. [ERROR] Slave I/O: error connecting to master

热门文章

  1. ZT:Java代码编写的30条建议
  2. Python私有变量的用法
  3. sql server 高可用故障转移(6)
  4. php中钩子(hook)的应用示例demo
  5. Vue2.0+ElementUI+PageHelper实现的表格分页
  6. SSH远程登录VWware上的LFS
  7. WinCE的开发流程
  8. Linux的网络管理命令使用总结
  9. 负载均衡研究 基础
  10. c# 空接合(??)运算符的运用