生产-消费模式的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的对比 线程协作 使用线程池)
死锁 多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形.某一个同步块同时拥有"两个以上对象的锁"时 ...
随机推荐
- jquery的html()、text()、val()的区别和用法
1.html() html()[无参]的使用方法是获取某元素内部的HTML代码,包括各种标签: 例:句1:<p>不知道大家高考的理综试卷里有没有关于科学家及其成就的选择题</p> ...
- MyEclipse快捷键大全,很实用
Eclipse本身很快的,但是加上了myeclipse后,就狂占内存,而且速度狂慢,那如何让Eclipse拖着myeclipse狂飚呢?这里提供一个: 技巧:取消自动validation valid ...
- Mac 下显示隐藏文件或文件夹
Mac 操作系统 隐藏显示文件 显示:defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏:defaults write co ...
- Spring Cloud程序报错总结
1.com.sun.jersey.api.client.ClientHandlerException: java.net.ConnectException: 原因如下: 在默认设置下,Eureka服务 ...
- 小程序里打开app的实现过程
之前开发过类似得需求,也踩了一些小坑,在这里和大家分享下,毕竟这样的需求也不在少数,基本上产品后期都会有这样的需求: 官方说明 因为需要用户主动触发才能打开 APP,所以该功能不由 API 来调用,需 ...
- js 流程控制语句
1.复合语句 2.switch语句 3.do...while语句 4.while语句 5.for语句 6.for...in语句 7.break和continue语句 9.with语句 10.if语句 ...
- 0 - python简介
Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...
- java IO流——字节流
字节流主要操作byte类型数据,以byte数组为准,主要操作类有InputStream(字节输入流).OutputSteam(字节输出流)由于IputStream和OutputStream都是抽象类, ...
- 【转】android gravity属性 和 weight属性
有点忘记这两个属性了,复习一下. 来看这个布局文件 <?xml version="1.0" encoding="utf-8"?> <Linea ...
- python web应用--web框架(三)
了解了WSGI框架,我们发现:其实一个Web App,就是写一个WSGI的处理函数,针对每个HTTP请求进行响应. 但是如何处理HTTP请求不是问题,问题是如何处理100个不同的URL. 每一个URL ...