生产-消费模式的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的对比 线程协作 使用线程池)
死锁 多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形.某一个同步块同时拥有"两个以上对象的锁"时 ...
随机推荐
- carousel 插件隐藏列表中几项导致左右切换出错
1. 一般的应用场景: 用于左右快速切换显示的列表内容,比如对员工的切换. 对于这种情况必不可少需要按照部门进行搜索,目前我的做法是首次加载所有该用户可以查看的员工列表,选择部门后又选择的隐藏掉其他不 ...
- Hibernate课程 初探一对多映射4-2 cascade级联属性
1 级联属性:hibernate一方和多方设置关联关系,当一方发生相应修改时(见下表),多方不用进行显式修改,也能进行相应修改. 级联在一方和多方xml中都可以设置 属性值 含义和作用 all 对 ...
- Unable to copy a file from obj\Debug to bin\Debug
1. Exit the VS2012, and then re-open the solution. 2. Clean the solution and build.
- 初识ImageSwither
imageswitcher继承自viewswitcher,使用ImageSwither只需要两步: 1.为ImageSwither提供一个ViewFactory,该ViewFactory生成的View ...
- struts 上传文件 Dynavalidatorform 实例
一.相关jar包 一个空struts工程的jar包: 另上传文件的两个jar包: 二.页面 1.上传页面upload.jsp <%@ page language="jav ...
- CentOS6.8上安装epel
实验环境: [root@bogon zhi]# uname -a Linux bogon -.el6.i686 # SMP Fri Nov :: UTC i686 i686 i386 GNU/Linu ...
- iOS获取/删除url中的参数
1.获取URL中的某个参数: - (NSString *)getParameter:(NSString *)parameter urlStr:(NSString *)url { NSError *er ...
- 笨办法学Python(一)
习题 1: 第一个程序 你应该在练习 0 中花了不少的时间,学会了如何安装文本编辑器.运行文本编辑器.以及如何运行命令行终端,而且你已经花时间熟悉了这些工具.请不要跳过前一个练习的内容直接进行下面的内 ...
- springboot实现邮件发送
1.创建springboot项目. 2.创建好的项目如图: 在static目录下新建index.html. 3.点击启动项目 在浏览器的地址栏中访问:http://localhost:8080/ 访问 ...
- eclipse 集成jdk
最近想整合一个工具,eplise中包含了 pc 自动化可用的一套环境,让其他测试人员,下载下来就可以用,不需要在进行安装其他东西,jdk安装也不需要,这事可有些犯难,eplise集成了svn和test ...