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. #if #endif #elif #undef

    #define aaa           //放在代码最前面 int a = 1; a = a + 1; #if !aaa {a = a + 1;}#elif !aaaaa {a=a+11;}#en ...

  2. CSS改变placeholder的颜色

    :-moz-placeholder { /* Mozilla Firefox 4 to 18 */ color: #a1a1a1; } ::-moz-placeholder { /* Mozilla ...

  3. 转:ACCESS数据库转ORACLE数据库分享

    来源: 作者:zz 网上有很多文章介绍access转oracle数据库的方法,本人都尝试了,不是很成功,列举一下,后来人不必盲目试了,基本不成功: 1.Access-->excel-->P ...

  4. centos6.5_64bit-Tomcat7安装部署

    此次安装系统版本及软件版本 centos6.5-64bit java -1.7.0_45 jdk1.8.0_111 apache-tomcat-7.0.73   一.检查java版本信息        ...

  5. PHP文件是什么?如何打开PHP文件?

    在平时我们可能会碰到过php文件,可是很多用户不知道php文件是什么文件?也不知道怎么打开php文件?为了满足一些用户的好奇心,小编现在就给大家讲解php文件以及如何打开php文件的方法. 1.PHP ...

  6. 笨办法学Python(二十七)

    习题 27: 记住逻辑关系 到此为止你已经学会了读写文件,命令行处理,以及很多 Python 数学运算功能.今天,你将要开始学习逻辑了.你要学习的不是研究院里的高深逻辑理论,只是程序员每天都用到的让程 ...

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

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

  8. c++ priority_queue

    1.默认为大顶堆 #include <iostream> #include <queue> using namespace std; int main() { priority ...

  9. Ubuntu 系统安装

    1.首先下载一个Ubuntu系统文件,以.ios后缀结尾的系统镜像文件压缩包. 2,下载一个ultraiso软件,用于制作u盘启动盘 3,将电脑重启,进入BOIS界面,调整系统顺序, 将启动盘系统设置 ...

  10. maven如何实现创建带源代码的jar包

    实现目标 maven打包,在生成的jar包中带有源代码.记住,这个带源代码的意思是源代码跟编译生成的文件放在一个jar文件里面,而不是单独的一个XXX-source.jar包. 实现思想 把源代码当作 ...