keil报错(reentrant用法) [问题点数:20分]

Bbs1
本版专家分:0
结帖率 0%
Bbs8
本版专家分:37608
版主
Blank
红花 2013年6月 硬件/嵌入开发大版内专家分月排行榜第一
2007年10月 硬件/嵌入开发大版内专家分月排行榜第一
2007年6月 硬件/嵌入开发大版内专家分月排行榜第一
2007年5月 硬件/嵌入开发大版内专家分月排行榜第一
2007年4月 硬件/嵌入开发大版内专家分月排行榜第一
2007年3月 硬件/嵌入开发大版内专家分月排行榜第一
Blank
黄花 2013年4月 硬件/嵌入开发大版内专家分月排行榜第二
2007年9月 硬件/嵌入开发大版内专家分月排行榜第二
Blank
蓝花 2013年5月 硬件/嵌入开发大版内专家分月排行榜第三
2012年9月 硬件/嵌入开发大版内专家分月排行榜第三
2007年11月 硬件/嵌入开发大版内专家分月排行榜第三
Bbs6
本版专家分:7718
Blank
红花 2018年7月 VC/MFC大版内专家分月排行榜第一
2017年10月 VC/MFC大版内专家分月排行榜第一
2016年3月 VC/MFC大版内专家分月排行榜第一
2014年10月 VC/MFC大版内专家分月排行榜第一
2014年9月 VC/MFC大版内专家分月排行榜第一
2014年7月 VC/MFC大版内专家分月排行榜第一
2014年6月 VC/MFC大版内专家分月排行榜第一
2014年5月 VC/MFC大版内专家分月排行榜第一
2014年4月 VC/MFC大版内专家分月排行榜第一
2014年2月 VC/MFC大版内专家分月排行榜第一
2013年7月 VC/MFC大版内专家分月排行榜第一
Blank
黄花 2019年12月 VC/MFC大版内专家分月排行榜第二
2019年11月 VC/MFC大版内专家分月排行榜第二
2019年11月 VC/MFC大版内专家分月排行榜第二
2019年9月 VC/MFC大版内专家分月排行榜第二
2019年8月 VC/MFC大版内专家分月排行榜第二
2019年7月 VC/MFC大版内专家分月排行榜第二
2019年6月 VC/MFC大版内专家分月排行榜第二
2019年5月 VC/MFC大版内专家分月排行榜第二
2019年4月 VC/MFC大版内专家分月排行榜第二
2019年3月 VC/MFC大版内专家分月排行榜第二
2018年10月 VC/MFC大版内专家分月排行榜第二
2018年9月 VC/MFC大版内专家分月排行榜第二
2018年8月 VC/MFC大版内专家分月排行榜第二
2018年5月 VC/MFC大版内专家分月排行榜第二
2017年12月 VC/MFC大版内专家分月排行榜第二
2017年6月 VC/MFC大版内专家分月排行榜第二
2017年5月 VC/MFC大版内专家分月排行榜第二
2017年1月 VC/MFC大版内专家分月排行榜第二
2016年11月 VC/MFC大版内专家分月排行榜第二
2016年4月 VC/MFC大版内专家分月排行榜第二
2014年11月 VC/MFC大版内专家分月排行榜第二
2014年1月 VC/MFC大版内专家分月排行榜第二
2013年10月 VC/MFC大版内专家分月排行榜第二
2013年9月 VC/MFC大版内专家分月排行榜第二
2013年6月 VC/MFC大版内专家分月排行榜第二
2013年4月 VC/MFC大版内专家分月排行榜第二
2012年6月 VC/MFC大版内专家分月排行榜第二
Blank
蓝花 2018年11月 VC/MFC大版内专家分月排行榜第三
2018年6月 VC/MFC大版内专家分月排行榜第三
2018年4月 VC/MFC大版内专家分月排行榜第三
2018年3月 VC/MFC大版内专家分月排行榜第三
2018年2月 VC/MFC大版内专家分月排行榜第三
2018年1月 VC/MFC大版内专家分月排行榜第三
2017年11月 VC/MFC大版内专家分月排行榜第三
2017年9月 VC/MFC大版内专家分月排行榜第三
2017年8月 VC/MFC大版内专家分月排行榜第三
2017年4月 VC/MFC大版内专家分月排行榜第三
2016年12月 VC/MFC大版内专家分月排行榜第三
2016年10月 VC/MFC大版内专家分月排行榜第三
2016年2月 VC/MFC大版内专家分月排行榜第三
2015年10月 VC/MFC大版内专家分月排行榜第三
2015年7月 VC/MFC大版内专家分月排行榜第三
2012年10月 VC/MFC大版内专家分月排行榜第三
Bbs7
本版专家分:11515
Bbs1
本版专家分:28
Bbs6
本版专家分:7718
Blank
红花 2018年7月 VC/MFC大版内专家分月排行榜第一
2017年10月 VC/MFC大版内专家分月排行榜第一
2016年3月 VC/MFC大版内专家分月排行榜第一
2014年10月 VC/MFC大版内专家分月排行榜第一
2014年9月 VC/MFC大版内专家分月排行榜第一
2014年7月 VC/MFC大版内专家分月排行榜第一
2014年6月 VC/MFC大版内专家分月排行榜第一
2014年5月 VC/MFC大版内专家分月排行榜第一
2014年4月 VC/MFC大版内专家分月排行榜第一
2014年2月 VC/MFC大版内专家分月排行榜第一
2013年7月 VC/MFC大版内专家分月排行榜第一
Blank
黄花 2019年12月 VC/MFC大版内专家分月排行榜第二
2019年11月 VC/MFC大版内专家分月排行榜第二
2019年11月 VC/MFC大版内专家分月排行榜第二
2019年9月 VC/MFC大版内专家分月排行榜第二
2019年8月 VC/MFC大版内专家分月排行榜第二
2019年7月 VC/MFC大版内专家分月排行榜第二
2019年6月 VC/MFC大版内专家分月排行榜第二
2019年5月 VC/MFC大版内专家分月排行榜第二
2019年4月 VC/MFC大版内专家分月排行榜第二
2019年3月 VC/MFC大版内专家分月排行榜第二
2018年10月 VC/MFC大版内专家分月排行榜第二
2018年9月 VC/MFC大版内专家分月排行榜第二
2018年8月 VC/MFC大版内专家分月排行榜第二
2018年5月 VC/MFC大版内专家分月排行榜第二
2017年12月 VC/MFC大版内专家分月排行榜第二
2017年6月 VC/MFC大版内专家分月排行榜第二
2017年5月 VC/MFC大版内专家分月排行榜第二
2017年1月 VC/MFC大版内专家分月排行榜第二
2016年11月 VC/MFC大版内专家分月排行榜第二
2016年4月 VC/MFC大版内专家分月排行榜第二
2014年11月 VC/MFC大版内专家分月排行榜第二
2014年1月 VC/MFC大版内专家分月排行榜第二
2013年10月 VC/MFC大版内专家分月排行榜第二
2013年9月 VC/MFC大版内专家分月排行榜第二
2013年6月 VC/MFC大版内专家分月排行榜第二
2013年4月 VC/MFC大版内专家分月排行榜第二
2012年6月 VC/MFC大版内专家分月排行榜第二
Blank
蓝花 2018年11月 VC/MFC大版内专家分月排行榜第三
2018年6月 VC/MFC大版内专家分月排行榜第三
2018年4月 VC/MFC大版内专家分月排行榜第三
2018年3月 VC/MFC大版内专家分月排行榜第三
2018年2月 VC/MFC大版内专家分月排行榜第三
2018年1月 VC/MFC大版内专家分月排行榜第三
2017年11月 VC/MFC大版内专家分月排行榜第三
2017年9月 VC/MFC大版内专家分月排行榜第三
2017年8月 VC/MFC大版内专家分月排行榜第三
2017年4月 VC/MFC大版内专家分月排行榜第三
2016年12月 VC/MFC大版内专家分月排行榜第三
2016年10月 VC/MFC大版内专家分月排行榜第三
2016年2月 VC/MFC大版内专家分月排行榜第三
2015年10月 VC/MFC大版内专家分月排行榜第三
2015年7月 VC/MFC大版内专家分月排行榜第三
2012年10月 VC/MFC大版内专家分月排行榜第三
第五章 ReentrantLock源码解析1--获得非公平锁与公平锁lock()
最常用的方式: int a = 12; //注意:通常情况下,这个会设置成一个类变量,比如说Segement中的段锁与copyOnWriteArrayList中的全局锁 final ReentrantLock lock = new ReentrantLock(); lock.lock();//获取锁...
详解JUC之锁——ReentrantLock类(03)
前言在详解JUC之锁——Lock与AQS(02)中我介绍了JUC锁的根基——AQS类还有公平锁和非公平锁,现在就可以正式介绍一下JUC锁家族其中的一个成员——ReentrantLockReentrantLockReentrantLock是一个互斥锁,也是一个可重入锁(Reentrant就是再次进入的意思)。ReentrantLock锁在同一个时间点只能被一个线程锁持有,但是它可以被单个线程多次获取,
Synchronized与ReentrantLock区别总结(简单粗暴,一目了然)
这篇文章是关于这两个同步锁的简单总结比较,关于底层源码实现原理没有过多涉及,后面会有关于这两个同步锁的底层原理篇幅去介绍。 相似点: 这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的同步,也就是说当如果一个线程获得了对象锁,进入了同步块,其他访问该同步块的线程都必须阻塞在同步块外面等待,而进行线程阻塞和唤醒的代价是比较高的(操作系统需要在用户态与内核态之间来回切换,代价很高...
Keil C51对C语言的关键词扩展之十五: reentrant
<em>reentrant</em>声明的函数为可重入函数。可重入的函数能够被多个进程同时调用。可重入函数在执行时,另外的进程可以中断当前执行的函数,并且调用同一个函数。正常情况下,C51程序中的函数不能被递归地调用,这是由于函数的参数和局部变量都被保存在固定的地址,在递归调用时操作了相同存储位置,导致数据被覆盖。 使用<em>reentrant</em>声明函数为可递归调用的可重入函数: int calc (char i,
ReentrantLock中tryLock的使用
请各位帮忙看看,以下是代码 static ReentrantLock lock = new ReentrantLock(); public static void main(String args)
可重入锁:ReentrantLock理解使用
(一)可重入性 可重入性描述这样的一个问题:一个线程在持有一个锁的时候,它内部能否再次(多次)申请该锁。如果一个线程已经获得了锁,其内部还可以多次申请该锁成功。那么我们就称该锁为可重入锁。通过以下伪代码说明: void methodA(){ lock.lock(); // 获取锁 methodB(); lock.unlock() // 释放锁 } void met...
玩转并发-ReentrantLock
概述 eentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性(关于synchronized可以看这篇文章),synchronized通过获取自增,释放自减的方式实现重入。与此同时,ReentrantLock还支持公平锁和...
-D_REENTRANT 宏作用
2._REENTRANT宏 在一个多线程程序里,默认情况下,只有一个errno变量供所有的线程共享。在一个线程准备获取刚才的错误代码时,该变量很容易被另一个线程中的函数调用所改变。类似的问题还存在于fputs之类的函数中,这些函数通常用一个单独的全局性区域来缓存输出数据。 为解决这个问题,需要使用可重入的例程。可重入代码可以被多次调用而仍然工作正常。编写的多线程程序,通过定义宏_REENTRA...
ReentrantLock功能详解
前言 Java里的锁主要分为两种:Synchronized关键字和java.util.concurrent.locks.Lock接口的实现类。之前也写过几篇关于Synchronized的博客:synchronized关键字(一):实现原理。所以本篇主要讲解ReentrantLock功能使用、与Synchronized关键字的区别等等 ReentrantLock 废话不多说,先来看看Reentran...
ReentrantLock原理分析
原文地址:https://www.jianshu.com/p/9e6e84f15b95前言ReentrantLock能够代替synchronized关键字完成独占锁的功能,并且允许占有锁线程的重入,显示地调用lock、unlock方法使得代码更灵活,收缩性更好。因为ReentrantLock的代码量很多并且逻辑复杂,所以要将每一部分的细节讲全很难做到。本篇内容将围绕Lock接口的lock、lock...
Java并发编程之ReentrantLock详解
---
Java 理论与实践: JDK 5.0 中更灵活、更具可伸缩性的锁定机制
新的锁定类提高了同步性 —— 但还不能现在就抛弃 synchronizedJDK 5.0 为开发人员开发高性能的并发应用程序提供了一些很有效的新选择。例如,java.util.concurrent.lock 中的类 ReentrantLock 被作为 Java 语言中 synchronized 功能的替代,它具有相同的内存语义、相同的锁定,但在争用条件下却有更好的性能,此外,它还有 synchro
keil中 如何解决warning L13:Recursive call to Function 及overlay解释
最近遇到一个比较奇怪的link warning
重入锁ReentrantLock+Condition 实现等待/通知
        在Java多线程编程中,可以使用Synchronized来实现同步,可以synchronized类,方法或代码块,另外还可以使用ReentrantLock来实现同样的功能,而且功能更加强大。        1. 使用ReentrantLock实现同步public class ReentrantLockTest { private Lock lock = new Reent...
Java中可重入锁ReentrantLock原理剖析
一、 概述 本文首先介绍Lock接口、ReentrantLock的类层次结构以及锁功能模板类AbstractQueuedSynchronizer的简单原理,然后通过分析ReentrantLock的lock方法和unlock方法,来解释ReentrantLock的内部原理,最后做一个总结。本文不涉及ReentrantLock中的条件变量。 1.1、Lock接口 Lock接口,是对控制并发的工具...
重入锁:ReentrantLock 详解
在JDK5.0版本之前,重入锁的性能远远好于synchronized关键字,JDK6.0版本之后synchronized得到了大量的优化,二者性能也部分伯仲,但是重入锁是可以完全替代synchronized关键字的。除此之外,重入锁又自带一系列高逼格UBFF:可中断响应、锁申请等待限时、公平锁。另外可以结合Condition来使用,使其更是逼格满满。先来盘花生米:package somhu;impo
C51中的reentrant
C51中的<em>reentrant</em> 关于<em>reentrant</em>的使用<em>keil</em>的官方论坛上有详细的讨论. Andy Neil(官方工程师)建议 "Are you sure that you really need to make everything <em>reentrant</em>?... A reading of the Keil app notes & knowledgebase
线程里synchronized的参数用什么?
我看到很多人用synchronized(参数)时,随便找个string,hashmap就作为参数了。 请问这个参数有什么用呢?synchronized不就是保证每个进来的线程结束后再放下一个线程进来,
ReentrantLock的lock-unlock流程详解
在jdk1.5之前,多线程之间的同步是依靠synchronized来实现。synchronized是java的关键字,直接由jvm解释成为指令进行线程同步管理。因为操作简单,而且现在jdk的后续版本已经对synchronized进行了很多的优化,所以一直是大家编写多线程程序常用的同步工具。那为什么要推出新的同步api呢?jdk1.5发布的时候,synchronized性能并不好,这可能是concurrent包出现的一个潜在原因,但是更重要的是新的api提供了更灵活,更细粒度的同步操作,以满足不同的需求。但是
ReentrantLock(true)为什么公平锁仍然会出现一个线程连续获得锁的情况?
ReentrantLock(true)为什么公平锁仍然会出现一个线程连续获得锁的情况? ``` public class LockFairTest implements Runnable{ //创建公平锁 private static ReentrantLock lock=new ReentrantLock(true); public void run() { while(true){ lock.lock(); try{ System.out.println(Thread.currentThread().getName()+"获得锁"); }finally{ lock.unlock(); } } } public static void main(String[] args) { LockFairTest lft=new LockFairTest(); Thread th1=new Thread(lft); Thread th2=new Thread(lft); th1.start(); th2.start(); } } ``` Thread-1获得锁 Thread-1获得锁 Thread-1获得锁 Thread-1获得锁 Thread-1获得锁 Thread-1获得锁 Thread-1获得锁 Thread-1获得锁 Thread-1获得锁 Thread-0获得锁 Thread-1获得锁 Thread-0获得锁
ReentrantLock问题记录
说ReentrantLock前我们先了解一下Lock与AbstractQueuedSynchronizer(AQS),Doug Lea大师为我们提供了大量实用,高性能的工具类,这些代码在java.util.concurrent包下。包的结构大概是: lock简介 我们下来看concurent包下的lock子包。锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享...
Reentrantlock 简介及其使用场景
1、Reentrantlock 是并发包中一个可重入的锁,是基于AQS(AbstractQueuedSynchronized)实现的,它有公平锁和不公平锁两种实现方式。 2、Reentranlock 中有一个内部抽象类 Sync 继承自 AbstractQueuedSynchronized ,主要是它来实现锁的功能, Sync 在 ReentrantLock 中有两种实现类:Nonf...
什么是轻量级锁,偏向锁???
网上的解释大同小异,不易理解。我只想知道羡慕两个问题: 1. 并发包中的ReentrantLock是偏向锁河轻量级锁码? 2. 偏向锁跟可重入性有什么区别,非偏向锁如何实现可重入?
ReentrantLock详解
一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义,但功能更强大。ReentrantLock 将由最近成功获得锁定,并且还没有释放该锁定的线程所拥有。当锁定没有被另一个线程所拥有时,调用 lock 的线程将成功获取该锁定并返回。如果当前线程已经拥有该锁定,此方法将立即返回。 示例1: package com.lock
有望进入FAQ中的问题:Kerl C51中的reentrant关键字在递归调用中的用法
我在使用Keil C编译器的递归调用重入机制时遇到了问题, 在运行时,Kerl 6.23的CPU仿真器总是抱怨: *** error 65: access violation at I:0xFF :
乐观锁以及乐观锁的实现
乐观锁介绍: 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。那么我们如何实现乐观锁呢,一般来说有以下2种方式: 1.使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。何谓数据版本?即...
Redisson(2-2)分布式锁实现对比 VS Java的ReentrantLock之带超时时间的tryLock
Redisson实现了一整套JDK中ReentrantLock的功能,这里对比一下实现的差异和核心的思想。 unfair模式的带超时时间的tryLock(超时时间) ReentrantLock 这里上来会直接先试下能不能try成功,如果不成功,进入等待并开始竞争等逻辑。 整个锁的核心是通过LockSupport的park方法来实现的,这是调用底层UNSAFE的park方法来实现...
Redis分布式锁之ReentrantLock
直接上代码 package persistent.prestige.redis.lock; import persistent.prestige.redis.RedisUtils;import redis.clients.jedis.Jedis; /** * 基于 redis 实现 公平的、自旋式、 分布式锁 * 实现思路: * 使用队列保持请求锁的顺序,请求线程在上一个线程的锁定状态自旋等...
Synchronized、 Volatile、ReentrantLock
Synchronized的实现原理: synchronized 的使用方式有如下几种: 线程状态及状态转换: synchronized实现何时使用了自旋锁? 在线程进入 ContentionList 时,即第一步操作前,线程在进入等待队列时首先进行自旋锁尝试获得锁,如果不成功再进入等待队列。 synchronized原理 -Java虚拟机的同步(Synchronization)是基于进入和退...
ReentrantLock实现原理
以下是本篇文章的大纲 1 synchronized和lock 1.1synchronized的局限性 1.2 Lock简介 2 AQS 3 lock()与unlock()实现原理 3.1 基础知识 3.2 内部结构 3.3 NonfairSync 3.3.1 lock() 3.3.2 unlock() 3.3.3 小结 3.4 FairS...
分析ReentrantLock的实现原理
http://www.jianshu.com/p/fe027772e156 什么是AQS AQS即是AbstractQueuedSynchronizer,一个用来构建锁和同步工具的框架,包括常用的ReentrantLock、CountDownLatch、Semaphore等。 AQS没有锁之类的概念,它有个state变量,是个int类型,在不同场合有着不同含义。本文研究的是锁,...
java多线程系列(四)---ReentrantLock的使用
Lock的使用 前言:本系列将从零开始讲解java多线程相关的技术,内容参考于《java多线程核心技术》与《java并发编程实战》等相关资料,希望站在巨人的肩膀上,再通过我的理解能让知识更加简单易懂。 目录 认识cpu、核心与线程 java多线程系列(一)之java多线程技能 java多线程系列(二)之对象变量的并发访问 java多线程系列(三)之等待通知机制 java多线程系列(...
彻底理解ReentrantLock
1. ReentrantLock的介绍 ReentrantLock重入锁,是实现Lock接口的一个类,也是在实际编程中使用频率很高的一个锁,支持重入性,表示能够对共享资源能够重复加锁,即当前线程获取该锁再次获取不会被阻塞。在java关键字synchronized隐式支持重入性(关于synchronized可以看这篇文章),synchronized通过获取自增,释放自减的方式实现重入。与此同时,R...
使用ReentrantLock的一点小问题
问题产生: 最近使用 ReentrantLock 在批处理代码中的时候,发现应该更新的1000+条数据中,只有2条成功更新了,百思不得其解,后来查询日志得知报了一个错 IllegalMonitorStateException ,问了度娘,解释为当前的线程不是此对象监视器的所有者。也就是要在当前线程锁定对象,才能用锁定的对象此行这些方法,像notify(),notifyAll()方法了,导致某一个...
ReentrantLock使用
所谓互斥锁, 指的是一次最多只能有一个线程持有的锁. 在jdk1.5之前, 我们通常使用synchronized机制控制多个线程对共享资源的访问. 而现在, Lock提供了比synchronized机制更广泛的锁定操作, Lock和synchronized机制的主要区别: synchronized机制提供了对与每个对象相关的隐式监视器锁的访问, 并强制所有锁获取和释放均要出现在一个块结构中, 当获取
可重入(reentrant)函数
什么是函数的可重入性?可以由多于一个任务并发使用,而不必担心数据错误。相反,不可重入(non-<em>reentrant</em>)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。 可重入函数:重点内容不为连续的调用持有静态数据。 不返回指向
c51 reentrant 关键字,用法的一点理解,欢迎板砖!
/* 单片机分 端口映射 和 内存映射 51 为端口映射 但亦可以扩展为内存映射 那样就是混合映射 大部分的非51 cpu为内存映射 端口映射的CPU需要对c语言进行扩展,扩展端口映射语句,sfr Register = addr; 内存映射的CPU直接用标准c就可。 与硬件相关时可用 #define Register (*(volatile uint8*)addr) 073182527
【转载】-D_REENTRANT编译选项
转载出处: http://blog.sina.com.cn/s/blog_8eda9f3501012boq.html -D_REENTRANT宏作用    _REENTRANT宏 在一个多线程程序里,默认情况下,只有一个errno变量供所有的 线程共享。假设在一个线程准备获取刚才的错误代码时,该变量很容易被另 外一个线程中的函数调用所改变。类似的问题还存在于fp
终于解决 归递调用 警告,其实程序没有 归递调用*** WARNING L13: RECURSIVE CALL TO SEGMENT
## 终于解决 归递调用 警告,其实程序没有 归递调用*** WARNING L13: RECURSIVE CALL TO SEGMENT> 引用块内容> http://blog.csdn.net/avideointerfaces/article/details/32687899> 以下是转载上面链接内容> 最近编译<em>keil</em>项目时,遇到一个比较奇怪的link warning,如下所
关于JAVA编程思想中synchronized和ReentrantLock
在学习JAVA编程思想并发一章时,关于synchronized和ReentrantLock的例子运行 结果与书中不一致。代码如下: ``` package thinking.in.java.chapter21; class Pair { private int x,y; public Pair(int x, int y) { this.x = x; this.y = y; } public Pair() { this(0,0); } public int getX(){ return x; } public int getY(){ return y; } public void incrementX(){x++;} public void incrementY(){y++;} @Override public String toString() { return "x=" + x + ", y=" + y; } public class PairValuesNotEqualException extends RuntimeException { public PairValuesNotEqualException() { super("Pair values not equal: " + Pair.this); } } public void checkstate(){ if(x != y) throw new PairValuesNotEqualException(); } } package thinking.in.java.chapter21; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; public abstract class PairManager { AtomicInteger checkCounter = new AtomicInteger(0); protected Pair p = new Pair(); private List storage = Collections.synchronizedList(new ArrayList()); public synchronized Pair getPair(){ return new Pair(p.getX(),p.getY()); } protected void store(Pair p){ storage.add(p); try{ TimeUnit.MILLISECONDS.sleep(50); }catch(InterruptedException e){} } public abstract void increment(); } package thinking.in.java.chapter21; public class PairChecker implements Runnable { private PairManager pm; public PairChecker(PairManager pm) { this.pm = pm; } @Override public void run() { while(true){ pm.checkCounter.incrementAndGet(); pm.getPair().checkstate(); } } } package thinking.in.java.chapter21; public class PairManager1 extends PairManager { @Override public synchronized void increment() { p.incrementX(); p.incrementY(); store(getPair()); } } package thinking.in.java.chapter21; public class PairManager2 extends PairManager { @Override public void increment() { Pair temp; synchronized (this) { p.incrementX(); p.incrementY(); temp = getPair(); } store(temp); } } package thinking.in.java.chapter21; public class PairManipulator implements Runnable { private PairManager pm; public PairManipulator(PairManager pm) { this.pm = pm; } @Override public void run() { while(true) pm.increment(); } @Override public String toString() { return "Pair: " + pm.getPair() + " checkerCounter = " + pm.checkCounter.get(); } } package thinking.in.java.chapter21; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class CriticalSection { static void testApproaches(PairManager pman1, PairManager pman2){ ExecutorService exec = Executors.newCachedThreadPool(); PairManipulator pm1 = new PairManipulator(pman1), pm2 = new PairManipulator(pman2); PairChecker pchecker1 = new PairChecker(pman1), pchecker2 = new PairChecker(pman2); exec.execute(pm1); exec.execute(pm2); exec.execute(pchecker1); exec.execute(pchecker2); try{ TimeUnit.MILLISECONDS.sleep(1000); }catch(InterruptedException e){ System.err.println("Sleep interrupted"); } System.out.println("pm1: " + pm1 + "\npm2: " + pm2); System.exit(0); } public static void main(String[] args) { PairManager pman1 = new PairManager1(), pman2 = new PairManager2(); testApproaches(pman1, pman2); } } package thinking.in.java.chapter21; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ExplicitPairManager1 extends PairManager { private Lock lock = new ReentrantLock(); @Override public void increment() { lock.lock(); try{ p.incrementX(); p.incrementY(); store(getPair()); }finally{ lock.unlock(); } } } package thinking.in.java.chapter21; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ExplicitPairManager2 extends PairManager { private Lock lock = new ReentrantLock(); @Override public void increment() { lock.lock(); Pair temp; try{ p.incrementX(); p.incrementY(); temp = getPair(); }finally{ lock.unlock(); } store(temp); } } package thinking.in.java.chapter21; public class ExolicitCritialSection { public static void main(String[] args) { PairManager pman1 = new ExplicitPairManager1(), pman2 = new ExplicitPairManager2(); CriticalSection.testApproaches(pman2, pman1); } } ``` 按照书中所说,ExolicitCritialSection和CriticalSection都不应该抛出PairValuesNotEqualException异常,可是ExolicitCritialSection中的两个线程都抛出了该异常, 个人分析在进行increment的时候,虽然是同步操作,可是在进行PairChecker时checkstate方法并未同步,他可以访问Pair对象中的X和Y值,所以按照书中的列子感觉都应该抛出PairValuesNotEqualException异常才对,为什么只有ExolicitCritialSection会抛出那????
*** Error: CreateProcess failed, Command...Keil MDK编译报错解决方法
有时候我们在网上下载了别人的代码,用自己电脑的编译器打开,编译,但是会报以下错误: 这可能是由于Keil版本不一致导致的,我们只需要把以下选项去掉即可解决问题: ...
轻松学习java可重入锁(ReentrantLock)的实现原理
前言相信学过java的人都知道 synchronized 这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么实现的。如果真是这样,而且你有兴趣了解,今天我将带领你轻松的学习下java中非常重要,也非常基础的可重入锁-ReentrantLock的实现机制。
ReentrantLock 源码分析
ReentrantLock 源码分析简介Lock接口提供的功能公平锁和非公平锁公平锁非公平锁公平锁和非公平锁性能对比 简介 ReentrantLock是Java SE 5新增的jdk层面实现可重入锁的功能, 提供了与synchronized类似的同步功能,只是在使用时需要显示的获取和释放锁。虽然缺少了隐私获取和释放锁的便捷性,但是缺拥有了锁获取和释放的可操作性、可中断的获取锁以及超时获取锁等多种s...
ReentrantLock 的使用
作者:骊骅 链接:https://www.jianshu.com/p/155260c8af6c 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 一、初识ReentrantLock import java.util.concurrent.locks.ReentrantLock; /** * Created by haicheng.lhc on 17/05/...
keil报错可能出现的问题
1.subscript on non-array or too many dimensions 数组和变量使用了相同的名字
逐渐深入Java多线程(四)----Java的ReentrantLock简介
目录 一,ReentrantLock简介 二,ReentrantLock可重入的原理 三,非公平锁的加锁 四,公平锁的加锁 五,解锁逻辑 六,ReentrantLock的Condition 七,ReentrantLock中的其他方法 八,关于Unsafe 一,ReentrantLock简介 ReentrantLock,字面意思是可重入锁,由JDK1.5加入,位于java.uti...
Java并发之ReentrantLock详解
一、入题 ReentrantLock是Java并发包中互斥锁,它有公平锁和非公平锁两种实现方式,以lock()为例,其使用方式为: ReentrantLock takeLock = new ReentrantLock(); // 获取锁 takeLock.lock(); try { ...
重入锁ReentrantLock的nonfairTryAcquire方法再次获取同步状态处理逻辑的疑问
重入锁ReentrantLock的nonfairTryAcquire方法再次获取同步状态的处理逻辑是通过判断当前线程是否为获取锁的线程来决定获取操作是否成功,如果是获取锁的线程再次请求,则将同步状态值
ReentrantLock 的使用方式
 参考:https://javadoop.com/2017/06/16/AbstractQueuedSynchronizer/ public class OrderService { // 使用static,这样每个线程拿到的是同一把锁,当然,spring mvc中service默认就是单例,别纠结这个 private static ReentrantLock reentran...
keil报错L104,请大神指教
这是ax399x_com.h中的函数声明 这是parallelinterface.c的函数定义 这是生成中间OBJ代码的<em>报错</em>。求大神指教。 http://pan.baidu.com/s/1bocOt
keil编译后生成的M51文件解析
通过*.m51文件我们可以清楚的看到单片机存储器的使用情况,以及可以看到每个变量包括局部变量的位置。 之前碰到一个问题,同样的程序,在small模式下编译后运行没问题,但在large模式下可以编译,但是运行出错。最后查看m51文件,发现了问题,在一个对时序要求很严格的地方声明几个局部变量,这几个局部变量有的被分配到data中,有的分配到xdata,在xdata中的变量访问时间要大于data中,导
ReentrantLock原理从开始到放弃
之前写了篇文章介绍了synchronized的原理《Java synchronized 原理从开始到放弃》,而本篇是介绍另外一个高频的出现在并发场景的类ReentrantLock,有必要深入理解他的使用和原理。 使用 与synchronized的异同 原理 AQS Condition 公平锁 非公平锁 ...
synchorized和ReetrantLock锁住的分别是什么
synchorized 是锁住了对象,对于同一个类内的其它带synchorized的方法都是一样的。 只要有一个线程执行synchorized方法,其它带synchorized方法的线程就会被阻塞? 而ReetrantLock锁住的是线程,非此线程一旦运行到带锁部分就会被挂起,对于其它的线程调用其它的lock块是不会影响的?
哪位大侠帮我解释一下,OSTaskCreateExt(void (*task)(void *pd)reentrant, .............
OSTaskCreateExt(void (*task)(void *pd)<em>reentrant</em>, void *dataptr, OS_STK *ptos, INT8U prio, INT16U id,
(二十九) ReentrantLock
前言: 从准备面试的时候就开始时不时接触ReentrantLock,相关博客也看了不少,总是感觉不是很理解,还是自己没有动手主动理解过的原因吧,现在工作也找了,离职也快了,熟悉一下ReentrantLock。参考博客:1. ReentrantLock实现原理2. 轻松学习java可重入锁(ReentrantLock)的实现原理3.再谈重入锁--ReentrantLock4.ReenTrantLoc...
ReentrantLock类中的方法
ReentrantLock类中的方法 ReentrantLock类中有很多的方法: getHoldCount():当前线程调用 lock() 方法的次数 getQueueLength():当前正在等待获取 Lock 锁的线程的估计数 getWaitQueueLength(Condition condition):当前正在等待状态的线程的估计数,需要传入 Condition 对象 hasWaite...
关于ReentrantLock使用的疑问?
直接上代码: ``` import java.util.concurrent.locks.ReentrantLock; public class MulThreadTest { public static int a = 0; ReentrantLock lock = new ReentrantLock(true); public void addInt(){ lock.lock(); a++; System.out.println(Thread.currentThread().getName()+"___________"+a +"_ " + lock.getHoldCount()); lock.unlock(); } public static void main(String[] args) throws InterruptedException { for(int i=0;i+i).start(); } } } ``` 运行结果总会丢数字,难道是使用方法有问题?帮忙解答一下~
java, 继承与依赖ReentrantLock, 在使用方法上的区别?
最近在看guava的cache源码, 发现LocalCache.Segment类是继承ReentrantLock. 但是我看Segment只用到了lock,unlock,isHeldByCurrentThread 三个方法, 这三个方法都是public的,就是说如果用依赖的方式,这几个方法都可以调用到的. 又查了一下ReentrantLock 的子类, 发现子类包括有: java.util.concurrent.ConcurrentHashMap.Segment 那么为什么不使用依赖(ReentrantLock lock= new ReentrantLock()), 而是用继承呢?? 或者说在什么情况下能体现出继承的好处?
Keil C51支持inline吗?
我写的inline函数编译通不过,去掉才可以。 如果不支持的话各位有什么提议吗?
请问try catch里面可以套try catch吗?
请教个问题,try catch里面可以套try catch吗? 比如 try { .... try { } catch{}; .... } catch { } 里面套个try catch主要是因为里面
reentrantlock如何实现和synchronized相同的内存语义
synchronized 内存语义:lock之后,同步代码块内的变量都从内存中取最新的,unlock之前,将线程的工作内存的东西都会更新到主内存。 而ReentrantLock 是如何实现synchronized的内存语义呢? 个人感觉:ReentrantLock源码里只是实现了一个锁的装置。并未涉及内存语义。难道所谓的内存语义是利用多线程间执行顺序来保证的吗? 嗯。不知道是自己哪里理解有问题。内存语义又没有办法用实验证明,请大牛提携一下!只是没钱,不好意思啊
函数可重入性(Reentrancy)概念详解
1.什么是可重入性 可重入的函数必须满足以下三个条件: (1)可以在执行的过程中被打断; (2)被打断之后,在该函数一次调用执行完之前,可以再次被调用(或进入,reentered)。 (3)再次调用执行完之后,被打断的上次调用可以继续恢复执行,并正确执行。 2.可重入与线程安全 可重入的定义源于单线程环境。在单线程环境下,一段代码在执行中可能被硬件中断,并转而调用中断服务程序(IS
ReentrantLock tryLock(timeout,timeUnit) 超时未返回
以下代码中,tryLock(timeout,timeUnit) 方法在超过2s后并未输出 “T2 got no lock end” 而是在T1线程结束后才有输出,但是如果以debug 模式运行或者替换代码中的Math.random()为其他耗时操作比如"TimeUnit.SECONDS.sleep(1)"时却可以在2s后输出 "T2 got no lock end",请问为什么会这样? ``` public class MyService2 { public ReentrantLock lock = new ReentrantLock(); public void waitMethod() { try { System.out.println(System.currentTimeMillis() + " " + Thread.currentThread().getName() + " enter "); boolean b = lock.tryLock(2, TimeUnit.SECONDS); if (b) { System.out.println(System.currentTimeMillis() + " lock begin:" + Thread.currentThread().getName()); for (int i = 0; i < Integer.MAX_VALUE / 10; i++) { Math.random(); } System.out.println(System.currentTimeMillis() + " lock end " + Thread.currentThread().getName()); return; } System.out.println(System.currentTimeMillis() + " " + Thread.currentThread().getName() + " got no lock end "); } catch (InterruptedException e) { e.printStackTrace(); } finally { if (lock.isHeldByCurrentThread()) { lock.unlock(); } } } public static void main(String[] args) throws InterruptedException { MyService2 myService2 = new MyService2(); Runnable runnable = myService2::waitMethod; Thread thread1 = new Thread(runnable); thread1.setName("T1"); thread1.start(); TimeUnit.MILLISECONDS.sleep(10); Thread thread2 = new Thread(runnable); thread2.setName("T2"); thread2.start(); } ```
ReentrantLock,多线程并发修改一个数据,结果重复数据,锁没有起作用
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public clas
Java锁:synchronized和lock
如果同一个对象有两个方法会对同一个资源p进行操作,一个方法用synchronized修饰,另一个方法用lock,这个资源p有被锁住吗 就比如一个set方法用syn,一个get方法用lock,然后一个线程去set,一个线程去get,会出现什么情况
ReentrantLock解析
最近学习Jdk的源代码时,读到了ConcurrentHashMap的源码实现时,发现每一个分段Segment都是ReentrantLock类型,于是顺带对ReentrantLock的源代码进行了学习。。在这里做一个笔记总结。因为只有在工作之余才能有空看看,所以思路有点零散,仅供参考。。。。 1、如何确定哪个线程可重复进入该锁                 在获取锁的时候,首先会检查
ReentrantLock与synchronized的区别
总的来说,lock更加灵活。 主要相同点:Lock能完成synchronized所实现的所有功能 不同: 1.ReentrantLock功能性方面更全面,比如时间锁等候,可中断锁等候,锁投票等,因此更有扩展性。在多个条件变量和高度竞争锁的地方,用ReentrantLock更合适,ReentrantLock还提供了Condition,对线程的等待和唤醒等操作更加灵活,一个Reentrant
Lock、ReentrantLock、ReentrantReadWriteLock原理及应用深入解析
Lock相比于synchronized具有更强大的功能,本文详细介绍lock、ReentrantLock和ReentrantReadWriteLock的原理与实用场景
Java多线程(九)之ReentrantLock与Condition
一、ReentrantLock 类 1.1 什么是<em>reentrant</em>lock java.util.concurrent.lock 中的 Lock 框架是锁定的一个抽象,它允许把锁定的实现作为 Java 类,而不是作为语言的特性来实现。这就为 Lock 的多种实现留下了空间,各种实现可能有不同的调度算法、性能特性或者锁定语义。 ReentrantLock 类实现了 Lock ,它拥有与 ...
深入分析ReentrantLock
ReentrantLock的锁资源以state状态描述,利用CAS则实现对锁资源的抢占,并通过一个CLH队列阻塞所有竞争线程,在后续则逐个唤醒等待中的竞争线程。ReentrantLock继承AQS完全从代码层面实现了java的同步机制,相对于synchronized,更容易实现对各类锁的扩展。
Vcenter5.0-6.7 ESXI6.0 -6.7注册下载
虚拟化Vcenter5.0-6.7 ESXI6.0 -ESXI6.7 注册,激活等 相关下载链接://download.csdn.net/download/name1234_cm/10716817?u
Java API例子Reentrantlock使用多个条件变量的含义
查看了下JDK里面的Reentrantlock,使用了两个条件变量去控制缓冲区的编写,JDK源码如下 class BoundedBuffer { final Lock lock = new Reent
jvm内存模型
JVM是我们成为一名架构师必须要掌握的一个知识体系,也是我们和一般只会敲代码的程序员特别能体现差距的地方。而JVM的数据结构基础,也就是它的内存模型,是它入门的第一课。下面我将分成3个方面向大家介绍J
为什么我正常运行代码跟我打断点以后运行的代码 结果不一样呢? (多线程ReentrantLock问题)
package com.jit.test; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Reentr
ReenTrantLock可重入锁(和synchronized的区别)总结
ReenTrantLock可重入锁(和synchronized的区别)总结 可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。   锁的实现: Synchronized是依赖于JVM实现的
JAVA面试要点010---重入锁_ReentrantLock 详解
  JAVA技术交流QQ群:170933152   https://www.cnblogs.com/-new/p/7256297.html 这个地方的文章还不错  ReentrantLocak特性(对比synchronized) 尝试获得锁 获取到锁的线程能够响应中断 ReentrantLock(重入锁) public class MyService { private L...
ReentrantLock比synchronized 强大在哪儿?
官方说明:一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义,但功能更强大。 强大在哪儿?求高人解释。
(五)可重入锁ReentrantLock的底层原理实现?
一、先整体了解一下重入锁ReentrantLock的大体思路? 先通过一张图,了解一下ReentrantLock的关系网(就好比看一个人NB不NB得先看他周围的人和家里的亲戚够不够NB,现在就开始看看ReentrantLock这个“家伙”有多牛逼!),先上图 首先ReentrantLock继承了他爸爸的AbstractQueuedSynchronizer的财产,这个人物有什么来历请看上一...
关于 ReentrantLock和CopyOnWriteArrayList一个疑惑
网上讲到CopyOnWriteArrayList读写分离,看了一下,是写的时候使用了ReentrantLock,读的过程中,新增一个副本;但是在写的过程中还可以进行读,那么这个锁ReentrantLock持有的锁对象(这也是一个疑问?ReentrantLock到底持有的什么)为什么还允许别的进程读???换成Synchronized可不可以??
Java并行(2): Monitor
1. 什么是Monitor?     Monitor其实是一种同步工具,也可以说是一种同步机制,它通常被描述为一个对象,主要特点是: 对象的所有方法都被“互斥”的执行。好比一个Monitor只有一个运行“许可”,任一个线程进入任何一个方法都需要获得这个“许可”,离开时把许可归还。通常提供singal机制:允许正持有“许可”的线程暂时放弃“许可”,等待某个谓词成真(条件变量),而条件成立
java可重入锁一般用于什么样的情况?
我理解的可重入锁是一个计数器,计算锁的次数。但我不知道它究竟用在什么样的场合里?谁能举一个具体的例子呢?
深入分析ReentrantLock公平锁和非公平锁的区别
在ReentrantLock中包含了公平锁和非公平锁两种锁,通过查看源码可以看到这两种锁都是继承自Sync,而Sync又继承自AbstractQueuedSynchronizer,而AbstractQueuedSynchronizer又继承自AbstractOwnableSynchronizer,下面是类的继承关系图: 其中AbstractOwnableSynchronizer是提供了设置占...
函数可重入性问题,为什么说函数体内调用了malloc()或者free()的函数是不可重入的?
在网上看到的文章说到: 一、可重入函数 1)什么是可重入性? 可重入(<em>reentrant</em>)函数可以由多于一个任务并发使用,而不必担心数据错误。相反, 不可重入(non-<em>reentrant</em>)函数不能由超
QList 的使用方法
本人没有使用过QList如果,有什么问题错了,请谅解。 我自己定义了一个结构体 typedef struct func { QString name; void (*func)(); }mapping
ReentrantLock本身线程安全问题
``` class Thread22 extends Thread { private String class_name = ""; public Thread22(String classname) { class_name = classname; } public void run() { MyObjTest myobj = new MyObjTest(); try { myobj.sayHello(true, class_name); } catch (InterruptedException e) { e.printStackTrace(); } } } class Thread33 extends Thread { private String class_name = ""; public Thread33(String classname) { class_name = classname; } public void run() { MyObjTest myobj = new MyObjTest(); try { myobj.sayHello(false, class_name); } catch (InterruptedException e) { e.printStackTrace(); } } } class MyObjTest { private static Integer count = new Integer(3); private Lock lock = new ReentrantLock(); public void sayHello(boolean delete, String classname) throws InterruptedException { lock.lock(); try { if (delete && count == 3) { Thread.sleep(2000); count--; System.out.println("Thread:" + classname + "| count: " + count); } else { count++; System.out.println("Thread:" + classname + "| else count: " + count); } } finally { lock.unlock(); } } public void sayHello_sync(boolean delete, String classname) throws InterruptedException { synchronized (count) { if (delete && count == 3) { Thread.sleep(2000); count--; System.out.println("Thread:" + classname + "| count: " + count); } else { count++; System.out.println("Thread:" + classname + "| else count: " + count); } } } } public class ThreadSafeTest { public static void main(String[] args) throws InterruptedException, ExecutionException { Thread22 t2 = new Thread22("t2"); Thread33 t3 = new Thread33("t3"); Thread33 t31 = new Thread33("t31"); Thread33 t32 = new Thread33("t32"); t2.start(); t3.start(); t31.start(); t32.start(); } } ``` 经测试ReentrantLock是没有起作用的,线程同时进入了受保护的代码。但将lock修改为静态的则解决是可以的: private static Lock lock = new ReentrantLock(); 那我就奇怪了,ReentrantLock()本身就是普通的类,如果在多个线程间使用时,也必须是唯一的实例才行?这样的话设计出来是不是有问题呢?
请问编译选项,-D_LIBC_REENTRANT 和-D_REENTRANT有什么不同?谢谢。
请问编译选项,-D_LIBC_REENTRANT 和-D_REENTRANT有什么不同?谢谢。 我发现makefile中用了-D_REENTRANT,这样能否保证 errno在多线程中是线程安全的?
ReentrantLock的四种加锁方式
ReentrantLock的四种加锁方式
扒一扒ReentrantLock以及AQS实现原理
摘要 提到JAVA加锁,我们通常会想到synchronized关键字或者是Java Concurrent Util(后面简称JCU)包下面的Lock,今天就来扒一扒Lock是如何实现的,比如我们可以先提出一些问题:当我们通实例化一个ReentrantLock并且调用它的lock或unlock...
一个java生产者消费者代码的问题
一个生产者消费者的代码,使用lock和condition实现。 [code="java"] import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; //生产/消费者模式 public class Basket { Lock lock = new ReentrantLock(); // 产生Condition对象 Condition produced = lock.newCondition(); Condition consumed = lock.newCondition(); boolean available = false; public void produce() throws InterruptedException { lock.lock(); try { if (available) { produced.await(); // 放弃lock进入睡眠 } System.out.println(&quot;Apple produced.&quot;); available = true; consumed.signal(); // 发信号唤醒等待这个Condition的线程 } finally { lock.unlock(); } } public void consume() throws InterruptedException { lock.lock(); try { if (!available) { consumed.await(); // 放弃lock进入睡眠 } /* 吃苹果 */ System.out.println(&quot;Apple consumed.&quot;); available = false; produced.signal(); // 发信号唤醒等待这个Condition的线程 } finally { lock.unlock(); } } } [/code] [code="java"] import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; //测试用类 public class ConditionTester { public static void main(String[] args) throws InterruptedException { final Basket basket = new Basket(); // 定义一个producer Runnable producer = new Runnable() { public void run() { try { basket.produce(); } catch (InterruptedException ex) { ex.printStackTrace(); } } }; // 定义一个consumer Runnable consumer = new Runnable() { public void run() { try { basket.consume(); } catch (InterruptedException ex) { ex.printStackTrace(); } } }; // 各产生10个consumer和producer ExecutorService service = Executors.newCachedThreadPool(); for (int i = 0; i < 4; i++) service.submit(consumer); Thread.sleep(2000*2); for (int i = 0; i < 4; i++) service.submit(producer); service.shutdown(); } } [/code] 以上代码我觉的执行结果应该是一个Apple prodeced 跟着一个App consumed, 就是说如果生产一个苹果,那么它应该立即被消费掉,但是实际的执行结果却不一定,有时候的执行结果为: [code="java"] Apple produced. Apple consumed. Apple produced. Apple produced. Apple consumed. Apple consumed. Apple produced. Apple consumed. [/code] 出现了连续生产两次苹果,我想问问大牛们是这是什么原因啊?
Kafka实战(三) - Kafka的自我修养与定位
Apache Kafka是消息引擎系统,也是一个分布式流处理平台(Distributed Streaming Platform) Kafka是LinkedIn公司内部孵化的项目。LinkedIn最开始有强烈的数据强实时处理方面的需求,其内部的诸多子系统要执行多种类型的数据处理与分析,主要包括业务系统和应用程序性能监控,以及用户行为数据处理等。 遇到的主要问题: 数据正确性不足 数据的收集主要...
BPFrameworks.pdf下载
BPFrameworks.pdf 相关下载链接:[url=//download.csdn.net/download/donghongtaodong/5040496?utm_source=bbsseo]//download.csdn.net/download/donghongtaodong/5040496?utm_source=bbsseo[/url]
jquery.validate.js下载
jquery.validate.js文件下载,js文件。下载直接用。!!! 相关下载链接:[url=//download.csdn.net/download/qq_40900196/10559428?utm_source=bbsseo]//download.csdn.net/download/qq_40900196/10559428?utm_source=bbsseo[/url]
ajax-autocomplete下载
ajax autocomplete 例子,可自动匹配文本框的文字,含完整的web应用。 相关下载链接:[url=//download.csdn.net/download/zybluesky/1074835?utm_source=bbsseo]//download.csdn.net/download/zybluesky/1074835?utm_source=bbsseo[/url]
相关热词 c# 二进制截断字符串 c#实现窗体设计器 c#检测是否为微信 c# plc s1200 c#里氏转换原则 c# 主界面 c# do loop c#存为组套 模板 c# 停掉协程 c# rgb 读取图片
我们是很有底线的