lock:

package com.net.thread.lock;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock; /**
* @author
* @Time:2017年8月23日 下午5:06:36
* @version 1.0
* @description 多生产/多消费,同步lock锁实现
*/
public class ReenTrantLockDemo3
{
public static void main(String[] args)
{
ReadThread t = new ReadThread();
for(int i = 0; i < 5; i++){
new Thread(new Runnable()
{
@Override
public void run()
{
while(true)
{
t.printX();
}
}
}).start(); new Thread(new Runnable()
{
@Override
public void run()
{
while(true)
{
t.printY();
}
}
}).start();
}
} static class ReadThread
{
private ReentrantLock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
private boolean isFalgX = true; public void printX()
{
try {
lock.lock();
while(!isFalgX){
condition.await();
}
System.out.println(Thread.currentThread().getName() + " +++++ " + System.currentTimeMillis());
Thread.sleep(1000);
isFalgX = false;
condition.signalAll();
} catch (Exception e) {
e.printStackTrace();
}finally{
lock.unlock();
}
} public void printY()
{
try {
lock.lock();
while(isFalgX){
condition.await();
}
System.out.println(Thread.currentThread().getName() + " ----- " + System.currentTimeMillis());
Thread.sleep(1000);
isFalgX = true;
condition.signalAll();
} catch (Exception e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}
} }

2、synchronized方法实现

package com.net.thread.synchonized;

/**
* @author
* @Time:2017年8月18日 下午4:20:36
* @version 1.0
* @description 多生产生产/多消费模式,无限循环
*/
public class SynMethodDemo3 { public static void main(String[] args)
{
MyThread mt = new MyThread();
for(int j = 0; j < 20; j++)
{
// put线程
new Thread(new Runnable()
{
public void run()
{
while(true)
{
mt.put();
}
}
}).start(); // take线程
new Thread(new Runnable()
{
public void run()
{
while(true)
{
mt.take();
}
}
}).start();
}
} static class MyThread
{
private boolean isPut = true;
public synchronized void put()
{
while (!isPut) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 0; i < 2; i++) {
System.out.println("put方法 : ++++++++++++++++++++" + i + " : " + Thread.currentThread().getName());
} try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
} isPut = false;
this.notifyAll();
} public synchronized void take()
{
while(isPut)
{
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for (int i = 0; i < 2; i++) {
System.out.println("take方法 :-------------------" + i + " : " + Thread.currentThread().getName());
} try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
isPut = true;
this.notifyAll();
}
} }

生产-消费模式的synchronized和lock实现(十)的更多相关文章

  1. Java的多线程实现生产/消费模式

    Java的多线程实现生产/消费模式 在Java的多线程中,我们经常使用某个Java对象的wait(),notify()以及notifyAll() 方法实现多线程的通讯,今天就使用Java的多线程实现生 ...

  2. synchronized和Lock复习

    刚学编程的时候,不懂得同步的概念,只认为程序按照自己写的顺序执行, 直到学到多线程,但当时理解同步问题,也只是面对临界资源需要加锁去控制, 解决一些,如生产消费的问题.但当时一直没考虑过,多线程的情况 ...

  3. 使用Condition实现多线程之间调用(生产消费模式)

    一,object 类的wait(),notify()和notifyAll() Java 线程类也是一个object 类,它的实例都继承自java.lang.Thread 或其子类.wait(),not ...

  4. 使用C#的泛型队列Queue实现生产消费模式

    本篇体验使用C#的泛型队列Queue<T>实现生产消费模式. 如果把生产消费想像成自动流水生产线的话,生产就是流水线的物料,消费就是某种设备对物料进行加工的行为,流水线就是队列. 现在,要 ...

  5. 5分钟搞清楚Synchronized和Lock的概念与区别

    前言 并发编程中,锁是经常需要用到的,今天我们一起来看下Java中的锁机制:synchronized和lock. Synchronized 和 Lock的概念 Synchronized 是Java 并 ...

  6. Synchronized 和 Lock 的主要区别(转)

    Synchronized 和 Lock 的主要区别Synchronzied 和 Lock 的主要区别如下: 存在层面:Syncronized 是Java 中的一个关键字,存在于 JVM 层面,Lock ...

  7. Synchronized与Lock的区别与应用场景

    转载. https://blog.csdn.net/fly910905/article/details/79765381 同步代码块,同步方法,或者是用java提供的锁机制,我们可以实现对共享资源变量 ...

  8. 并发编程的锁机制:synchronized和lock

    1. 锁的种类 锁的种类有很多,包括:自旋锁.自旋锁的其他种类.阻塞锁.可重入锁.读写锁.互斥锁.悲观锁.乐观锁.公平锁.可重入锁等等,其余就不列出了.我们重点看如下几种:可重入锁.读写锁.可中断锁. ...

  9. 第41天学习打卡(死锁 Lock synchronized与Lock的对比 线程协作 使用线程池)

    死锁 多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形.某一个同步块同时拥有"两个以上对象的锁"时 ...

随机推荐

  1. iOS 时间戳转成今天,上午,下午,星期几,几月几日,某年某月某日

    项目中有聊天功能,老板让聊天的时间转换成和 QQ 的聊天时间一样的格式, 研究了一下,来分析下 QQ 的聊天格式时间 代码: 会话列表显示的时间 如需转成24小时制,需要使用 HH //时间显示内容 ...

  2. 基于百度ai,图灵机器人,Flask 实现的网站语音智能问答

    准备以下模块中的函数 from aip import AipSpeech import time import os import requests APP_ID = '15420654' API_K ...

  3. (三)JavaScript之[事件]与[字符串]

    5].事件**JavaScript事件:HTML事件 * HTML事件是发生在HTML元素上的事情 * HTML事件可以是[浏览器的行为],也可以是[用户的行为] * * 实例: * HTML页面完成 ...

  4. python--json和pickle序列化

    字符串存储 一般需要有信息需要记录的都写到文件上面,把要记录的信息转成字符串,然后在写入到文件中.这算是一种记录方式. 比如有一组用户信息需要存起来.数据定义好之后就可以写文件. info = { ' ...

  5. ZIP文件压缩和解压

    最近要做一个文件交互,上传和下载, 都是zip压缩文件,所以研究了下,写了如下的示例 注意引用  ICSharpCode.SharpZipLib.dll 文件 该dll文件可以到官方网站去下载, 我这 ...

  6. Python基本数据类型(一)

    一.int的函数说明(部分函数Python2特有,Python3已删除,部分函数Python3新增:) class int(object): """ int(x=0) - ...

  7. 虚拟机的NAT模式连接centos7配置静态IP连接外网

    小小的配置,各种五花八门的介绍. 1.打开VMWare->编辑->虚拟网络编辑器->点击更改设置 2.选中VMnet8->取消使用本地DHCP服务将IP地址分配给虚拟机-> ...

  8. 在ABAP里取得一个数据库表记录数的两种方法

    方法1:使用函数EM_GET_NUMBER_OF_ENTRIES 这个函数使用起来很简单,只需要将想查询的数据库表名称维护进输入参数IT_TABLES: 上图说明这个函数支持批量操作,我查询的两张表名 ...

  9. 转:SSM框架——使用MyBatis Generator自动创建代码

    转:https://blog.csdn.net/zhshulin/article/details/23912615 这两天需要用到MyBatis的代码自动生成的功能,由于MyBatis属于一种半自动的 ...

  10. C++STL之set集合容器

    set集合容器 set集合容器实现了红黑树(Red-Black Tree)的平衡二叉检索树的数据结构, 在 插入元素时, 它会自动调整二叉树的排列, 把该元素放到适当的位置, 以确保每个子树根节点的键 ...