java编程四线第二十一章 线程SynchronizationComparisons.java有错误

//BaseLine 和AtomicTest 是线程不安全的 ,求解答

//: concurrency/SynchronizationComparisons.java
// Comparing the performance of explicit Locks
// and Atomics versus the synchronized keyword.
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
import java.util.concurrent.locks.*;
import java.util.*;
import static net.mindview.util.Print.*;

abstract class Accumulator {
public static long cycles = 50000L;
// Number of Modifiers and Readers during each test:
private static final int N = 4;
public static ExecutorService exec =
Executors.newFixedThreadPool(N*2);
private static CyclicBarrier barrier =
new CyclicBarrier(N*2 + 1);
protected volatile int index = 0;
protected volatile long value = 0;
protected long duration = 0;
protected String id = "error";
protected final static int SIZE = 100000;
protected static int[] preLoaded = new int[SIZE];
static {
// Load the array of random numbers:
Random rand = new Random(47);
for(int i = 0; i < SIZE; i++)
preLoaded[i] = rand.nextInt();
}
public abstract void accumulate();
public abstract long read();
private class Modifier implements Runnable {
public void run() {
for(long i = 0; i < cycles; i++)
accumulate();
try {
barrier.await();
} catch(Exception e) {
throw new RuntimeException(e);
}
}
}
private class Reader implements Runnable {
private volatile long value;
public void run() {
for(long i = 0; i < cycles; i++)
value = read();
try {
barrier.await();
} catch(Exception e) {
throw new RuntimeException(e);
}
}
}
public void timedTest() {
long start = System.nanoTime();
for(int i = 0; i < N; i++) {
exec.execute(new Modifier());
exec.execute(new Reader());
}
try {
barrier.await();
} catch(Exception e) {
throw new RuntimeException(e);
}
duration = System.nanoTime() - start;
printf("%-13s: %13d\n", id, duration);
}
public static void
report(Accumulator acc1, Accumulator acc2) {
printf("%-22s: %.2f\n", acc1.id + "/" + acc2.id,
(double)acc1.duration/(double)acc2.duration);
}
}

class BaseLine extends Accumulator {
{ id = "BaseLine"; }
public void accumulate() {
value += preLoaded[index++];
if(index >= SIZE) index = 0;
}
public long read() { return value; }
}

class SynchronizedTest extends Accumulator {
{ id = "synchronized"; }
public synchronized void accumulate() {
value += preLoaded[index++];
if(index >= SIZE) index = 0;
}
public synchronized long read() {
return value;
}
}

class LockTest extends Accumulator {
{ id = "Lock"; }
private Lock lock = new ReentrantLock();
public void accumulate() {
lock.lock();
try {
value += preLoaded[index++];
if(index >= SIZE) index = 0;
} finally {
lock.unlock();
}
}
public long read() {
lock.lock();
try {
return value;
} finally {
lock.unlock();
}
}
}

class AtomicTest extends Accumulator {
{ id = "Atomic"; }
private AtomicInteger index = new AtomicInteger(0);
private AtomicLong value = new AtomicLong(0);
public void accumulate() {
// Oops! Relying on more than one Atomic at
// a time doesn't work. But it still gives us
// a performance indicator:
int i = index.getAndIncrement();
value.getAndAdd(preLoaded[i]);
if(++i >= SIZE)
index.set(0);
}
public long read() { return value.get(); }
}

public class SynchronizationComparisons {
static BaseLine baseLine = new BaseLine();
static SynchronizedTest synch = new SynchronizedTest();
static LockTest lock = new LockTest();
static AtomicTest atomic = new AtomicTest();
static void test() {
print("============================");
printf("%-12s : %13d\n", "Cycles", Accumulator.cycles);
baseLine.timedTest();
synch.timedTest();
lock.timedTest();
atomic.timedTest();
Accumulator.report(synch, baseLine);
Accumulator.report(lock, baseLine);
Accumulator.report(atomic, baseLine);
Accumulator.report(synch, lock);
Accumulator.report(synch, atomic);
Accumulator.report(lock, atomic);
}
public static void main(String[] args) {
int iterations = 5; // Default
if(args.length > 0) // Optionally change iterations
iterations = new Integer(args[0]);
// The first time fills the thread pool:
print("Warmup");
baseLine.timedTest();
// Now the initial test doesn't include the cost
// of starting the threads for the first time.
// Produce multiple data points:
for(int i = 0; i < iterations; i++) {
test();
Accumulator.cycles = 2;
}
Accumulator.exec.shutdown();
}
} /
Output: (Sample)
Warmup

BaseLine : 34237033

Cycles : 50000
BaseLine : 20966632
synchronized : 24326555
Lock : 53669950
Atomic : 30552487
synchronized/BaseLine : 1.16
Lock/BaseLine : 2.56
Atomic/BaseLine : 1.46
synchronized/Lock : 0.45
synchronized/Atomic : 0.79

Lock/Atomic : 1.76

Cycles : 100000
BaseLine : 41512818
synchronized : 43843003
Lock : 87430386
Atomic : 51892350
synchronized/BaseLine : 1.06
Lock/BaseLine : 2.11
Atomic/BaseLine : 1.25
synchronized/Lock : 0.50
synchronized/Atomic : 0.84

Lock/Atomic : 1.68

Cycles : 200000
BaseLine : 80176670
synchronized : 5455046661
Lock : 177686829
Atomic : 101789194
synchronized/BaseLine : 68.04
Lock/BaseLine : 2.22
Atomic/BaseLine : 1.27
synchronized/Lock : 30.70
synchronized/Atomic : 53.59

Lock/Atomic : 1.75

Cycles : 400000
BaseLine : 160383513
synchronized : 780052493
Lock : 362187652
Atomic : 202030984
synchronized/BaseLine : 4.86
Lock/BaseLine : 2.26
Atomic/BaseLine : 1.26
synchronized/Lock : 2.15
synchronized/Atomic : 3.86

Lock/Atomic : 1.79

Cycles : 800000
BaseLine : 322064955
synchronized : 336155014
Lock : 704615531
Atomic : 393231542
synchronized/BaseLine : 1.04
Lock/BaseLine : 2.19
Atomic/BaseLine : 1.22
synchronized/Lock : 0.47
synchronized/Atomic : 0.85

Lock/Atomic : 1.79

Cycles : 1600000
BaseLine : 650004120
synchronized : 52235762925
Lock : 1419602771
Atomic : 796950171
synchronized/BaseLine : 80.36
Lock/BaseLine : 2.18
Atomic/BaseLine : 1.23
synchronized/Lock : 36.80
synchronized/Atomic : 65.54

Lock/Atomic : 1.78

Cycles : 3200000
BaseLine : 1285664519
synchronized : 96336767661
Lock : 2846988654
Atomic : 1590545726
synchronized/BaseLine : 74.93
Lock/BaseLine : 2.21
Atomic/BaseLine : 1.24
synchronized/Lock : 33.84
synchronized/Atomic : 60.57
Lock/Atomic : 1.79
*///:~

1个回答

w3812127
w3812127 呵呵,BaseLine 和AtomicTest种 int i处和 index++处非原子操作,有8个线程同时操作,引起混乱。最终引起数组越界。
3 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java编程 ---线程
0、相关概念理解 1、线程的组成以及线程的创建、启动和调度 2、线程的基本控制 3、选择创建线程的方法 4、使用Java技术中的 synchronized 关键字 5、线程交互 —wait 与 notify 6、线程同步
java编程线程
帮助你更加了解java
Java编程-线程实例
初步学习Java编程的同学可借鉴,学的比较好的就不用看了
java编程——Java线程
Java线程
黑马程序员--Java编程之多线程
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-一.线程与进程一.进程:1.什么是进程:它是”操作系统”中的概念;对于操作系统来说,每个单独运行的”程序”就是一个”进程”; 2.什么是多进程:是指操作系统可以同时维护多个应用程序的同时运行;统一分配资源; 3.多进程的意义: 1).充分的利用系统资源; 2).可以提高用户的体验度;使用户有非常好的使用体验
JAVA编程之多线程
一、线程相关概念程序:是为完成特定任务,用某种语言编写的一组指令的集合,即指一段静态的代码,静态对象。进程:是程序的一次执行过成程,或是正在运行的一个程序。动态过程:有它自身的差生,存在和消亡的过程。程序是静态的,进程是动态的。线程:进程可进一步细化为线程,是一个程序内部的一条执行路径若一个程序可同一时间执行多个线程,就是支持多线程每个java程序有一个隐含的线程就是mainJava 提供了三种创...
Java编程之多线程异常处理
下面通过实例来演示一下如何处理多线程异常: 源程序: class MyThread extends Thread{ public void run(){ System.out.println("Throwing in " +"MyThread"); throw new RuntimeException(); } } class Main { ...
第二十一章:并发(下)
新类库中的构件 CountDownLatch 可以向CountDownLatch对象设置一个初始计数值,任何对象在这个对象上调用await()方法都将阻塞,直至这个计数值为0(如果一开始就是0那就不用等待)。我们通过其他任务在这个对象上调用countDown()来缩小这个计数值(最多减到0)。这个构件的意义就是设置一些任务必须在n个任务都完成的情况下才可以执行。 import jav
java编程中的低级错误
Map: map是一种经典的k-v格式存储结构,在使用过程中由于粗心导致了若干问题。 1. map的初始化不可以用key-value进行直接的初始化,
Java编程易犯错误
1. Map的get(Object)方法,有可能返回null,需要自行检验!
读书笔记_第二十一章
#创建包 #npar包,自动下载,自动安装 #未运行成功,对应地址下并无此文件 pkg &amp;lt;- &quot;npar_1.0.tar.gz&quot; loc &amp;lt;- &quot;http://www.statmethods.net/RiA&quot; url &amp;lt;- paste(loc,pkg,sep=&quot;/&quot;) download.file(url,pkg) install.packages(pkg,repos=NULL,...
Java编程main函数,输入输出错误
第一个错误 eclipse运行Java,错误: the selection cannot be launched,and there are no rece 解决:1.将main函数的格式作为一种固定格式 public static void main(String[] args) { } 2.一个函数中最多包含一个public类! 出现的情况;public static void ma...
java编程十大低级错误
java编程中需要竭力避免的10大低级错误,否则要被同行看扁了
这个线程有错误么
用wininet写了个一个支持http下载的客户端,任务线程在下载时候用 SetOption来设置超时的问题,可是没有用,后来才发现这是ms的一个bug。rn后来就想在任务线程中把Read();函数部分开一个线程,这样来判断read的超时问题。再没有加超时判断线程时,程序没有任何不良反映,但是加了超时线程后,当判断出超时,任务线程退出,过了10秒左右就会有提示 Runtime Error abnormal program terminal!怀疑是内存释放的问题rn超时线程如下,大家看一下:rnrn //nRead = pFile->Read(buffer, BUFFER_SIZE);//这个是读远程文件的函数,在没有超时线程时候用。rnrnrn任务线程序中添加超时线程的代码:rnrnphttpdown->a_nRead = &nRead;rnphttpdown->pFile=pFile;rnphttpdown->buffer=buffer;rnHANDLE _thread = CreateThread(NULL,0,ReadThread,(LPVOID)phttpdown,0,NULL);rnif(WaitForSingleObject(_thread,30*1000) == WAIT_TIMEOUT)rnrn delete phttpdown;rn phttpdown=NULL;rn ASSERT(pFile!=NULL); rn pFile->Close();rn delete pFile;rn pFile=NULL;rn return FALSE;rnrnrn超时线程: rnDWORD WINAPI ReadThread(LPVOID param)rnrn httpdown * p = (httpdown *)param;rn *(p->a_nRead) = p->pFile->Read(p->buffer,BUFFER_SIZE);rn delete p;rn p=NULL;rn return 1;rnrn传递参数的数据结构rntypedef struct httpdownrnrn unsigned int * a_nRead;rn CHttpFile* pFile;rn BYTE * buffer;rnhttpdown;rnrn测试了一下,传递的参数没有错误rnrn请大虾看看为什么加了超时线程后会有这个Runtime Error呢 ?我释放的资源有什么问题呢 ?rn
java编程之线程,继承Thread类
线程测试类package ThreadTest; //java编程之线程 /** * 1.start()是用来启动线程,启动之后会自动调用线程中的run()方法 * * */ public class Test1 { //主线程为当前类的线程 public static void main(String[] args) { // TODO A
Java编程--多线程(线程的同步和死锁)
Java编程--多线程(线程的同步和死锁)内容:1. 线程的同步产生原因;2. 线程的同步处理操作;3. 线程的死锁情况。具体内容(了解)一.同步问题的引出:同步:多个线程访问同一资源时候所需要考虑到的问题。【范例】观察非同步情况下的操作。class MyThread implements Runnable { private int ticket = 5; @Override publi...
java编程的生产者消费者同步锁线程测试
同步锁 线程 生产者消费者问题 适合新手的线程练习
java编程 线程的经典实用案例
经典的线程案例,java基础编程应用,编程必备。
java编程之多线程 runnable的使用
import java.awt.*; import java.net.*; import javax.swing.*; public class MyTest extends JFrame{     private JLabel jl=new JLabel();     private static Thread t;          private int count=0;
java编程之线程,实现Runnable接口
package ThreadTest; //java编程之线程,实现Runnable接口 /** * 1.在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口 * */ public class Test2 { public static void main(String[] args) { // TODO Auto-genera
第二十一章 泛型(generic)
第二十一章 泛型(generic) (1)引言      泛型:是指参数化类型的能力。      例如:有这样一个类:这是一个比较简单并且是很常用的带有泛型的方法。      package com.lidd.generic;      public class GenericTestSecond { public void one(T t){ }
java编程题目 有答案
java编程试题.很多实例非常经典..很值得去研究
JAVA编程有搞头么?
JAVA编程有搞头么?当然有搞头!有搞头就赶快搞,“太阳”就要下山了!
哪里有java编程帮助文档?
在用jsp+javabean写web应用程序时,经常遇到一些不知如何查API 函数,或者对于需要import的类不知在工程中需要增加哪些库文件,java是否有有类似msdn的文档可供查询?
Windows程序设计第二十一章
Windows程序设计第二十一章 Windows程序设计第二十一章
数据库视频-第十七-第二十一章
【使用.NET访问SQL Server 2008】 1.ADO.NET基础知识 ADO.NET提供对Microsoft SQL Server等数据源以及通过OLE DB和XML公开的数据源的一致访问。数据共享使用者应用程序可以使用ADO.NET来连接到这些数据源,并检索、操作和更新数据。 ADO.NET有效地从数据操作中将数据访问分解为多个可以单独使用或一前一后使用的不连续组件。ADO.NET包含...
第二十一章 NoSQL(上)
21.1 NoSQL介绍 21.2 memcached介绍 数据结构简单(k-v),数据存放在内存里。memcached 不支持持久化,数据落地。每当memcached服务重启或者重启服务器,数据就会丢失。但可以定时来备份来让数据落地 21.3 安装memcached 使用yum下载安装 yum -y install memcached 想下载最新版本可...
第二十一章 Chisel基础——黑盒
因为Chisel的功能相对Verilog来说还不完善,所以设计人员在当前版本下无法实现的功能,就需要用Verilog来实现。在这种情况下,可以使用Chisel的BlackBox功能,它的作用就是向Chisel代码提供了用Verilog设计的电路的接口,使得Chisel层面的代码可以通过模块的端口来进行交互。 一、例化黑盒 如果读者尝试在Chisel的模块里例化另一个模块,然后生成Verilog...
第二十一章 SRPM 的使用 : rpmbuild
谈完了 RPM 类型的软件之后,再来我们谈一谈包含了 Source code 的 SRPM 该如何使用呢?假如今天我们由网络上面下载了一个 SRPM 的文件,该如何安装他?又,如果我想要修改这个 SRPM 里面原始码的相关配置值,又该如何订正与重新编译呢? [color=red]此外,最需要注意的是,新版的 rpm 已经将 RPM 与 SRPM 的命令分开了,SRPM 使用的是 rpmbuild ...
第二十一章 IO流1
21.1 字节流与字符流 字节流:按基本元素字节读写的流   抽象基类:InputStream,OutputStream 字符流:与编码表结合,按字符读写的流   抽象基类:Reader,Writer 21.2 FileWriter 继承关系:Writer-OutputStream-FileWriter FileWriter fw = new FileWriter("x:/xx/
第二十一章 SpringMVC集成测试
测试Web项目,通常不需要启动项目,我们需要一些Servlet相关的模拟对象,比如:MockMVC、MockHttpServletRequest、MockHttpServletResponse、MockHttpSession等。一、添加依赖<dependency> <groupId>org.springframework</groupId> <artifactId>spring-te
第二十一章 NoSQL(中)
21.9 redis介绍 21.10 redis安装 daemonize yes 表示redis为后台启动,终端继续做其他事情logfile &quot;/var/log/redis.log&quot; 定义redis的日志路径dir /data/redis 定义redis的RDB,aof文件的存放路径appendonly yes 开启aof日志 在dir定义的目录下存aof文件 vim /etc/r...
Node.js 第二十一章- 连接MySQL
一、本篇,我们学习下如何使用Node.js来连接MySQL,并对数据库进行操作。 二、安装驱动 $ cnpm install mysql 三、连接数据库 在以下实例中,根据你的实际配置修改数据库用户名、及密码及数据库名。 ...
算法导论第二十一章习题解答
能用代码表示的都用代码表示,不能表示的写出思路,思路都没写的就是我也做不出来
Thinking in Java:第二十一章-并发
1:概述:对于某些问题,能够并发的执行程序中的多个部分,则会变得非常方便甚至非常必要 2:并发的多面性:为了使程序运行的更快,你必须学会如何利用这些额外的处理器,而这正是并发赋予你的能力。从性能的角度来说,如果没有任务会被阻塞,那么在单处理器中使用并发就没有任何意义。 3: 定义任务:LiftOff /** * Created By Percy Gauguin On 2018/2/6 *
java编程的一些错误,很奇怪
TestHTML2XML t = new TestHTML2XML("c:\\smth.html","c:\\smth.xml","c:\\aerr.html");rnt.convert(); //把html文档转换为xml文档rnDocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();rnDocumentBuilder bulider = factory.newDocumentBuilder();rnFile xmlfile = new File("c:\\smth.xml");rnDocument doc = bulider.parse(xmlfile); //对刚才的xml文档进行parsernrn下面的是在convert()函数里的涉及上面的几行代码,其中tidy是一个现有的包rntidy.setMakeClean(true);rntidy.setXmlOut(true);rntidy.parseDOM(in,out);rnrn现在的问题是编译出错如下:rnorg.xml.sax.SAXParseException: 缺少空白在 SYSTEM 文本统一资源标识符之前。rn at org.apache.crimson.parser.Parser2.fatal(Unknown Source)rn at org.apache.crimson.parser.Parser2.fatal(Unknown Source)rn at org.apache.crimson.parser.Parser2.whitespace(Unknown Source)rn at org.apache.crimson.parser.Parser2.maybeExternalID(Unknown Source)rn at org.apache.crimson.parser.Parser2.maybeDoctypeDecl(Unknown Source)rn at org.apache.crimson.parser.Parser2.parseInternal(Unknown Source)rn at org.apache.crimson.parser.Parser2.parse(Unknown Source)rn at org.apache.crimson.parser.XMLReaderImpl.parse(Unknown Source)rn at org.apache.crimson.jaxp.DocumentBuilderImpl.parse(Unknown Source)rn at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)rn at TestHTML2XML.main(TestHTML2XML.java:136)rnException in thread "main" rnrn初步发现是html转换过来的xml文档有问题,至少不符合tidy的要求,因为我用标准xml文档带入,正常执行,现在的问题是怎么解决这个xml文档不标准的问题.谢谢
JAVA编程JAVA编程
JAVA编程JAVA编程JAVA编程JAVA编程
错误!(线程)
void CMFC_TaskingDoc::SuspendSpinner(int nIndex, BOOL bSuspend)rnrn if (!bSuspend)rn rn if (m_pSpinThread[nIndex])rn rn HANDLE hThread=m_pSpinThread[nIndex]->m_hThread;rn ::WaitForSingleObject(hThread,INFINITE);rn rn rn elsern rn int iSpnr;rn switch(nIndex)rn rn case 0:rn iSpnr=1;rn break;rn case 1:rn iSpnr=3;rn break;rn rn m_pSpinThread[nIndex]=AfxBeginThread(ThreadFunc,(LPVOID)&m_cSpin[iSpnr]);////////这局有错误!说是第一个参数传递错误!rn rnrnrnrnrnrnUINT CMFC_TaskingDoc::ThreadFunc(LPVOID pParam)rnrn CSpinner *lpSpin=(CSpinner*)pParam;rn BOOL *pbContinue=lpSpin->GetContinue();rn while (*pbContinue)rn rn lpSpin->Draw();rn rn return 0;rnrnerror C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'unsigned int (void *)'rnrnrn请问为什么啊?还有怎么解决?rnrn顺便问一下!如果把SuspendSpinner 加上static 也会有5个错误为什么啊?rnrn谢谢!
线程的错误!
我用一个timer控件来测试网络是否通!rn如果没通我就把线程aa->Suspend(),然后再aa->Resume();rn但现在出现下面的错误!rnrnProject recv.exe raised exception class EThread with message 'Thread Error: 拒绝访问。 (5)'.rnProcess stopped. UseStep or Run to continue.rn不知道流程对不对请各位帮忙:(
线程错误???
用VS.net 2002编写一个简单的windows程序rnrn其中有一条语句,如下:rnThread80 = new Thread(new ThreadStart(this.Listen()));rnrn其中Listen()方法我已经写出,并重载1次rnrn但编译的时候,却提示我一个错误“G:\work\c#\mir3\Form1.cs(550): 应输入方法名称”!!!rnrn百思不得其解啊!!! 明明程序里面有Listen()的方法 为什么提示这个错误呢?rnrn见鬼了,还请大家帮忙看看
相关热词 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图 c# 验证码图片生成类 c# 再次尝试 连接失败 c#开发编写规范 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数