- 浏览: 468387 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (146)
- Maven (3)
- Quartz (10)
- Hessian (3)
- JDK (42)
- eclipse (4)
- 设计思想 (6)
- XML (8)
- JavaMail (1)
- Spring (11)
- mina (1)
- HsqlDb (1)
- Cache (2)
- Tool (6)
- 心情 (5)
- JQuery (0)
- Hadoop (5)
- Hbase (3)
- 自动构建 (7)
- JNDI (0)
- 代码赏析 (5)
- Oracle (1)
- Excel (4)
- Effective Java (5)
- JAXB (4)
- fdafasdf (1)
- ccc (0)
- web (3)
- concurrent (1)
- CVS (1)
- eclipse plugin (2)
- Apache (10)
最新评论
-
chxiaowu:
nice!
Quartz实现固定执行次数 -
zxjlwt:
学习了。http://surenpi.com
自定义ClassLoader -
kadlly:
public static final Logger log ...
Hessian 权限认证 -
spring_springmvc:
java程序语言学习教程 地址http://www.zuida ...
Java-Final -
liushuiwuyan:
[img][/img]
设计模式-单例
需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓库可以存放10个产品。 第一批产品需要生产20个产品,并消费完毕。
这次不使用独占锁,使用CPU原语CAS.
CAS 简单来说就是由CPU比较内存位置的值是否为当前值,如是则将其设置为next,如否则返回false.因此上面的代码片段要在一个无限循环中执行,这样可以保证并发时id的顺序.
基于CAS操作可以认为是无阻塞的,并且由于CAS操作是CPU原语,因此其性能会好于之前同步锁得方式。
这里使用CAS原语. 当多个线程同时执行时,只有一个会成功.
这次不使用独占锁,使用CPU原语CAS.
CAS 简单来说就是由CPU比较内存位置的值是否为当前值,如是则将其设置为next,如否则返回false.因此上面的代码片段要在一个无限循环中执行,这样可以保证并发时id的顺序.
基于CAS操作可以认为是无阻塞的,并且由于CAS操作是CPU原语,因此其性能会好于之前同步锁得方式。
package ycl.learn.effective.java.thread.pc; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; /** * 公共资源类 */ public class PublicResourceAtomic { private BlockingQueue<Product> queue = new LinkedBlockingQueue<Product>(10); public static final int MAX_RESOURCE = 20; private AtomicInteger lock = new AtomicInteger(0); private AtomicInteger index = new AtomicInteger(0); /** * 增加公共资源 */ public boolean increace() { while(true){ int s = lock.get(); int nextSeed = s+1; if(lock.compareAndSet(s, nextSeed)){//CAS 原语实现 if(isComplete()){//生产任务完成 return false; } int tindex = index.incrementAndGet(); Product p = new Product(tindex); try { queue.put(p); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread()+"increace:" + tindex); return true; } } } /** * 减少公共资源 */ public boolean decreace() { while(true){ int s = lock.get(); int nextSeed = s; if(lock.compareAndSet(s, nextSeed)){//CAS 原语实现 if (isEmpty()) { if(isComplete()){//如果消费结束,将会死锁,因为isEmpty()is true forever, 所以不管你如何notify,他始终等待,添加当wait被notify时,消费任务完成,退出。 return false; } } if(!isEmpty()){ Product p = null; try { p = queue.take(); } catch (InterruptedException e) { System.err.println(e); e.printStackTrace(); } System.out.println(Thread.currentThread()+"decreace:" + p.index); } return true; } } } public boolean isFull(){ return queue.size() == 10; } /** * 判断是否空了 */ public boolean isEmpty() { return queue.isEmpty(); } /** * 判断生产完毕 */ public boolean isComplete() { return index.get() >= MAX_RESOURCE; } class Product{ public int index; public Product(int index){ this.index = index; } } }
这里使用CAS原语. 当多个线程同时执行时,只有一个会成功.
发表评论
-
Java Application Cache
2016-09-27 19:25 884Application Cache is used very ... -
Java 字符串分词
2015-01-02 14:43 1749在Java的世界里有个类型 ... -
jdk 1.6 新特性,集成Groovy, 性能很差
2014-04-02 14:27 1276性能都是相对的,如果调用量不是很大的话,可以忽略,毕竟使用为主 ... -
Fake Code easy implements
2014-04-01 15:41 1027package org.miniframe.modules ... -
JDK regex 用法及用途
2014-03-31 15:48 1215查找 Boolean flag = pattern.mat ... -
生产者消费者(三)
2014-03-04 10:59 960需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓 ... -
生产者消费者(二)
2014-03-03 15:40 695需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓 ... -
生产者消费者模式(一)
2014-02-28 14:30 1031需求: 多个生产者不断的生产产品,多个消费者不断的消费产品,仓 ... -
查看Class文件使用的JDK版本
2013-10-30 14:17 1115由于JDK一般是向下兼容的,所以有时候本地的JDK版本比类库的 ... -
Java源代码转码
2012-12-20 17:22 1323现在中国的项目很多,编码无非是UTF-8,GBK,GB2312 ... -
Tomcat集成OSGI,并通过JNDI开放Web调用
2012-12-03 11:22 3135Tomcat集成OSGi,首先要选择OSGI服务器,我这里采用 ... -
JDK的Logging
2012-11-07 15:49 1683jdk自带有一个log日志,对于一般的使用,仅够了. 代码如下 ... -
java.util.*
2012-11-06 14:23 1377java.util 工具包,灰常的有用,有机会一定要研读源码。 ... -
java.util.concurrent.*
2012-11-02 10:38 17761. java.util.concurrent.ArrayBl ... -
java.util.rt.*
2012-10-31 13:51 11131. java.util.HashMap 散列表,主要是以离散 ... -
巧秒设计方法,不返回null
2016-09-27 19:32 723/** * {@inheritDoc} * ... -
java doc 代码文档
2012-07-13 13:58 1330对于代码规范不解释了,网上很多。 在编写代码的时候,有一点灰 ... -
接口与抽象类
2012-07-11 16:53 11241. 接口设计必谨慎,除非业务变更,否则打死不能动接口。[不变 ... -
JVM优化机制好诡异
2012-04-20 08:43 1466long i[] = new long[1000000]; ... -
JVM优化机制好诡异
2016-09-27 19:32 562long i[] = new long[100000 ...
相关推荐
生产者消费者问题解决方案 生产者消费者问题是计算机科学中的一种经典问题,描述的是在多线程环境中,多个生产者线程和消费者线程之间的协作问题。生产者线程负责生产数据,并将其存储在缓冲区中,而消费者线程则从...
多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多生产者,多消费者问题源代码多...
生产者消费者模式是一种多线程或并发编程中的经典设计模式,它主要用于解决系统资源的高效利用和同步问题。在C++中实现生产者消费者模式,我们可以利用C++11及更高版本提供的线程库()、互斥量()、条件变量()等...
7. **例程分析**:在提供的"生产者消费者"例程中,可能包含了创建生产者和消费者线程、初始化队列、添加数据到队列、从队列中取出数据、以及使用同步机制保证正确性的代码片段。通过对这些例程的分析和运行,可以...
"生产者消费者问题C++代码实现" 生产者消费者问题是一个经典的进程同步问题,该问题最早由 Dijkstra 提出,用以演示他提出的信号量机制。在同一个进程地址空间内执行的两个线程。生产者线程生产物品,然后将物品...
### 生产者与消费者实验报告知识点详述 #### 一、引言 在计算机科学领域,生产者与消费者模型是一种经典的同步机制,被广泛应用于多线程编程、操作系统设计以及分布式系统架构中。该模型主要解决的是多个进程或...
生产者消费者流程图; 生产者消费者流程图。
生产者消费者问题是多线程编程中的一个经典案例,它展示了如何通过线程间的协作来解决资源的同步和异步操作。在C++中,我们可以利用标准库中的互斥量(mutex)、条件变量(condition_variable)等工具来实现这个问题...
生产者消费者的实现。可以自主地改变生产者,消费者的数目,和缓冲区。
生产者消费者问题是多线程编程中的经典模型,用于展示如何高效地在多个线程之间共享资源。MFC(Microsoft Foundation Classes)是微软提供的一套面向对象的C++库,用于构建Windows应用程序。在这个问题中,我们将...
生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...
在IT领域,生产者消费者架构是一种常见的多线程或并发编程模型,用于高效地处理数据流。这个模型基于消息队列的概念,适用于各种环境,包括LabVIEW(Laboratory Virtual Instrument Engineering Workbench)这样的...
在多线程编程中,"生产者-消费者"模型是一个经典的并发问题,它涉及到了如何在多个线程间共享资源并协同工作。本示例是使用C++实现的一个解决方案,结合了Posix信号量和互斥量来确保线程安全和同步。 生产者-消费者...
此外,pv操作还可以广泛应用于各种生产者消费者问题的解决中,使得系统更为可靠和高效。 pv操作是解决生产者与消费者问题的常用方法之一。通过pv操作,我们可以确保生产者进程和消费者进程之间的同步,避免数据的...
生产者消费者问题是多线程编程中的一个经典案例,它展示了如何通过线程间的协作来解决资源的并发访问问题。在C#中,我们可以利用System.Threading命名空间提供的工具来实现这一模型。下面将详细阐述这个问题的背景、...
生产者消费者问题是多线程编程中的经典模型,用于模拟两个或多个并发执行的实体(生产者和消费者)共享有限资源的情况。在这个问题中,生产者负责生成数据并放入缓冲区,而消费者则从缓冲区取出数据进行处理。当缓冲...