TIJ 21.4.1 装饰性花园
Entrance.run()方法,++number时,作者进行了同步,而且,还专门注释说“Increase number(synchronized increase)”。我认为,此处根本无需同步,因为,对于每个 Entrance对象,肯定都有自己的 number 域,这个 number 域除了 Entrance对象以外,根本没有其他线程,需要修改它。每个Entrance对象修改自己的 number,各个对象间互不打扰
即使,在其他线程(即main线程)OrnamentalGarden调用了Entrance.sumEntrances()(从而调用了Entrance.getValue()),这也是 Entrance.run()线程完成后才调用的,所以,顶多
Entrance.getValue()同步下可以理解
有人有同感嘛?难道我SB啦,或者Bruce出错了
package tij4.concurrency;
//: concurrency/OrnamentalGarden.java
import static net.mindview.util.Print.print;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
class Count {
private int count = 0;
private Random rand = new Random(47);
// Remove the synchronized keyword to see counting fail:
public synchronized int increment() {
int temp = count;
if (rand.nextBoolean()) // Yield half the time
Thread.yield();
return (count = ++temp);
}
public synchronized int value() {
return count;
}
}
class Entrance implements Runnable {
private static Count count = new Count();
private static List<Entrance> entrances = new ArrayList<Entrance>();
private int number = 0;
// Doesn't need synchronization to read:
private final int id;
private static volatile boolean canceled = false;
// Atomic operation on a volatile field:
public static void cancel() {
canceled = true;
}
public Entrance(int id) {
this.id = id;
// Keep this task in a list. Also prevents
// garbage collection of dead tasks:
entrances.add(this);
}
public void run() {
while (!canceled) {
synchronized (this) {
++number;
}
print(this + " Total: " + count.increment());
try {
TimeUnit.MILLISECONDS.sleep(100);
} catch (InterruptedException e) {
print("sleep interrupted");
}
}
print("Stopping " + this);
}
public synchronized int getValue() {
return number;
}
public String toString() {
return "Entrance " + id + ": " + getValue();
}
public static int getTotalCount() {
return count.value();
}
public static int sumEntrances() {
int sum = 0;
for (Entrance entrance : entrances)
sum += entrance.getValue();
return sum;
}
}
public class OrnamentalGarden {
public static void main(String[] args) throws Exception {
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < 5; i++)
exec.execute(new Entrance(i));
// Run for a while, then stop and collect the data:
TimeUnit.SECONDS.sleep(3);
Entrance.cancel();
exec.shutdown();
if (!exec.awaitTermination(250, TimeUnit.MILLISECONDS))
print("Some tasks were not terminated!");
print("Total: " + Entrance.getTotalCount());
print("Sum of Entrances: " + Entrance.sumEntrances());
}
}
分享到:
相关推荐
《TIJ4-solutions》是针对《Thinking in Java》第四版(简称TIJ4)的一份解决方案集。这本书由Bruce Eckel撰写,是Java编程领域里极具影响力的教材之一,深受程序员喜爱。本压缩包中的"TIJ4-solutions.pdf"很可能是...
《Thinking in Java》是Bruce Eckel的经典编程教材,第四版更是深受广大Java程序员喜爱。这个压缩包"TIJ4-code-master.zip"包含了该书的源代码、相关jar包以及练习题的答案,为学习者提供了全面的实践资源。 1. **...
【TIJ阅读笔记】 在Java编程中,内存管理是一个关键的概念。Java的内存分为两种主要区域:堆(Heap)和栈(Stack)。堆是用于动态创建对象的主要内存池,包括数组和其他复杂对象,由垃圾回收机制自动管理。而栈则...
Thinking in java 4 Source Code
《深入理解Java编程思想》是Java开发者们常常参考的一本经典书籍,其源代码"TIJ4-code.rar_TI"提供了一种深入学习Java编程的宝贵资源。这本书籍着重于理论与实践相结合,通过丰富的示例代码帮助读者掌握Java的核心...
他最著名的作品之一是《Thinking in Java》(简称 TIJ),这是一本深入讲解 Java 编程的书籍,被许多开发者视为学习 Java 的经典教材。 描述中提到的 "TIJ3" 指的是《Thinking in Java》的第三版。这个库可能是为了...
《Thinking in Java》(TiJ)是一本经典的Java编程语言学习教材,由Bruce Eckel撰写,首次出版于1998年,并随着Java的发展不断更新版本。第四版(TIJ4)在2006年2月发布,而配套的解决方案指南则是在2007年9月出版。...
TIJ4 Initialization Cleanup
这意味着,未经版权所有者的明确许可,任何人不得将其发布到任何网站、复制或分发该文档,也不得公开展示(例如在投影仪上),甚至不能以此为基础创作衍生作品。此外,书中所提供的源代码是按照“原样提供”的原则,...
《Thinking in Java》是 Bruce Eckel 编著的一本经典的Java编程教材,第四版更是深受程序员喜爱。"conversationemk"可能是指作者在书中提到的一个特定的示例或实验,而"TIJ4-code"则显然是这个压缩包中包含的所有...
《Thinking in Java》是Bruce Eckel的经典编程教材,第四版更是深受程序员喜爱。这本书深入浅出地介绍了Java语言,强调了面向对象编程的核心概念。源代码TIJ4-code包含了书中所有示例程序,是读者实践和理解书本理论...
《Java编程思想》第四版是 Bruce Eckel 的经典著作,这本书深入浅出地介绍了Java语言,深受广大开发者喜爱。"tij4-code:java编程思想第四版-GIT" 指的是该书的源代码已经托管在了Git版本控制系统中,方便读者查阅和...
《Java编程思想第四版》(Thinking in Java 4th Edition)是 Bruce Eckel 所著的一本经典Java学习书籍,其配套练习题旨在帮助读者深入理解Java语言的核心概念和技术。"TIJ4-code_idea"项目是这本书的代码示例和练习...
完成后,您应该看到几个级别的目录,并且在C:\TIJ4\code目录中,除其他外,您C:\TIJ4\code看到与本书各章相对应的子目录。 从的安装Java JDK SE5或更高版本。 您最终还将需要该文档,该文档可在该页面的后面找到。...
thinking in java 4 Reusing Classes 读书笔记
对于有一定基础的读者来说,该书可能包含了一些高级主题、设计模式、最佳实践以及解决复杂编程问题的策略。 3. 版权信息:文档中包含了详细的版权信息,明确指出该书不是免费软件,不能在网站上发布、复制或分发。...
《Thinking in Java》是Bruce Eckel的经典之作,第四版更是对Java编程的深入解析和思考。这本书涵盖了Java语言的基础到高级特性,旨在帮助读者全面理解Java编程思想,从而提升编程能力。现在,我们来深入探讨一下...
标题中的“tij.rar_VB控制_界面编程”暗示了这个压缩包可能包含与Visual Basic(VB)编程相关的资源,特别是关于如何在VB环境中进行界面设计和控件自适应调整的内容。描述中提到的“VB自动地调整VB控制的大小和一种...
生产者消费者模型是一种多线程同步的经典设计模式,它源于操作系统中的进程通信概念,用于解决资源的高效利用和协同工作问题。在这个模型中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。为了确保生产...