生产-消费模式的synchronized和lock实现(十)
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实现(十)的更多相关文章
- Java的多线程实现生产/消费模式
Java的多线程实现生产/消费模式 在Java的多线程中,我们经常使用某个Java对象的wait(),notify()以及notifyAll() 方法实现多线程的通讯,今天就使用Java的多线程实现生 ...
- synchronized和Lock复习
刚学编程的时候,不懂得同步的概念,只认为程序按照自己写的顺序执行, 直到学到多线程,但当时理解同步问题,也只是面对临界资源需要加锁去控制, 解决一些,如生产消费的问题.但当时一直没考虑过,多线程的情况 ...
- 使用Condition实现多线程之间调用(生产消费模式)
一,object 类的wait(),notify()和notifyAll() Java 线程类也是一个object 类,它的实例都继承自java.lang.Thread 或其子类.wait(),not ...
- 使用C#的泛型队列Queue实现生产消费模式
本篇体验使用C#的泛型队列Queue<T>实现生产消费模式. 如果把生产消费想像成自动流水生产线的话,生产就是流水线的物料,消费就是某种设备对物料进行加工的行为,流水线就是队列. 现在,要 ...
- 5分钟搞清楚Synchronized和Lock的概念与区别
前言 并发编程中,锁是经常需要用到的,今天我们一起来看下Java中的锁机制:synchronized和lock. Synchronized 和 Lock的概念 Synchronized 是Java 并 ...
- Synchronized 和 Lock 的主要区别(转)
Synchronized 和 Lock 的主要区别Synchronzied 和 Lock 的主要区别如下: 存在层面:Syncronized 是Java 中的一个关键字,存在于 JVM 层面,Lock ...
- Synchronized与Lock的区别与应用场景
转载. https://blog.csdn.net/fly910905/article/details/79765381 同步代码块,同步方法,或者是用java提供的锁机制,我们可以实现对共享资源变量 ...
- 并发编程的锁机制:synchronized和lock
1. 锁的种类 锁的种类有很多,包括:自旋锁.自旋锁的其他种类.阻塞锁.可重入锁.读写锁.互斥锁.悲观锁.乐观锁.公平锁.可重入锁等等,其余就不列出了.我们重点看如下几种:可重入锁.读写锁.可中断锁. ...
- 第41天学习打卡(死锁 Lock synchronized与Lock的对比 线程协作 使用线程池)
死锁 多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形.某一个同步块同时拥有"两个以上对象的锁"时 ...
随机推荐
- 在项目引用里添加上对Microsoft Word 11.0 object library的引用
private void button1_Click(object sender, System.EventArgs e) { //调用打开文件对话框获取要打开的文件WORD文件,RTF文件,文本文件 ...
- xml解析demo使用
package lianxi; import java.io.FileOutputStream;import java.io.OutputStreamWriter; import javax.xml. ...
- 一些实用的浏览器meta
标签: 兼容性 meta 通用 <!--声明文档使用的字符编码--> <meta charset='utf-8′> <!--viewport定义--> <me ...
- HTML的行内元素与块级元素的区别?
块级元素:独占一行,其宽度自动填满父元素的宽度,可以容纳行内元素和其他块级元素,可以设置margin和padding值. 行内元素:不会独占一行,与其他行内元素排成一行,直到其父元素拍不下,才会从新一 ...
- ActiveMQ实例2--Spring JMS发送消息
参考文章:http://my.oschina.net/xiaoxishan/blog/381209#OSC_h3_7 一,步骤参照参考文献 二.新建的项目 三.补充 web.xml <?xml ...
- Android学习笔记4——Activity详解
在 Android 开发过程中,与程序员打交道最多的应该就是作为四大组件之一的 Activity 了.接下来我们就一起来揭开 Activity 的神秘面纱吧~ 一.概述 什么是 Activity(活动 ...
- matplotlib安装指南
matplotlib安装指南1.介绍NumPy地址 http://www.numpy.org/NumPy:一个Python一个扩展库,支持大量的维度数组和举证运算,对数组提供大量的函数库 SciPy地 ...
- So you want to write a desktop app in Python
So you want to write a desktop app in Python Thomas Kluyver 2014-06-16 23:55 51 Comments Source This ...
- 【2017-06-20】Linux应用开发工程师C/C++面试问题记录之一:Linux多线程程序的同步问题
参考之一:Linux 线程同步的三种方法 链接地址:http://www.cnblogs.com/eleclsc/p/5838790.html 简要回答: Linux下线程同步最常用的三种方法就是互斥 ...
- iRecognizer号码扫描开发实录
iRecognizer——这是一款可以帮助你快速扫描获得印刷体数字的软件 现已上架 腾讯应用宝,酷安 提供的功能:扫一扫(相册或当场扫描),获得电话号码,之后就可以拨打或者发送短信,自动复制到剪贴板, ...