`
iceman1952
  • 浏览: 8354 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类

TIJ 线程,为什么我老觉得 例程 有问题。我太SB啦还是Bruce出错了

阅读更多
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

    《TIJ4-solutions》是针对《Thinking in Java》第四版(简称TIJ4)的一份解决方案集。这本书由Bruce Eckel撰写,是Java编程领域里极具影响力的教材之一,深受程序员喜爱。本压缩包中的"TIJ4-solutions.pdf"很可能是...

    TIJ4-code-master.zip及相关jar包、练习题答案

    《Thinking in Java》是Bruce Eckel的经典编程教材,第四版更是深受广大Java程序员喜爱。这个压缩包"TIJ4-code-master.zip"包含了该书的源代码、相关jar包以及练习题的答案,为学习者提供了全面的实践资源。 1. **...

    TIJ阅读笔记.doc

    【TIJ阅读笔记】 在Java编程中,内存管理是一个关键的概念。Java的内存分为两种主要区域:堆(Heap)和栈(Stack)。堆是用于动态创建对象的主要内存池,包括数组和其他复杂对象,由垃圾回收机制自动管理。而栈则...

    TIJ4 Code

    Thinking in java 4 Source Code

    TIJ4-code.rar_TI

    《深入理解Java编程思想》是Java开发者们常常参考的一本经典书籍,其源代码"TIJ4-code.rar_TI"提供了一种深入学习Java编程的宝贵资源。这本书籍着重于理论与实践相结合,通过丰富的示例代码帮助读者掌握Java的核心...

    com.bruceeckel.*

    他最著名的作品之一是《Thinking in Java》(简称 TIJ),这是一本深入讲解 Java 编程的书籍,被许多开发者视为学习 Java 的经典教材。 描述中提到的 "TIJ3" 指的是《Thinking in Java》的第三版。这个库可能是为了...

    Thinking in java\TIJ4-solutions-demo

    《Thinking in Java》(TiJ)是一本经典的Java编程语言学习教材,由Bruce Eckel撰写,首次出版于1998年,并随着Java的发展不断更新版本。第四版(TIJ4)在2006年2月发布,而配套的解决方案指南则是在2007年9月出版。...

    TIJ4 Initialization Cleanup

    TIJ4 Initialization Cleanup

    The Thinking in Java Annotated Solution Guide(TIJ4-solutions)

    这意味着,未经版权所有者的明确许可,任何人不得将其发布到任何网站、复制或分发该文档,也不得公开展示(例如在投影仪上),甚至不能以此为基础创作衍生作品。此外,书中所提供的源代码是按照“原样提供”的原则,...

    TIJ4-code_ThinkinginJava_conversationemk_

    《Thinking in Java》是 Bruce Eckel 编著的一本经典的Java编程教材,第四版更是深受程序员喜爱。"conversationemk"可能是指作者在书中提到的一个特定的示例或实验,而"TIJ4-code"则显然是这个压缩包中包含的所有...

    Thinking In Java 第四版-源代码TIJ4-code

    《Thinking in Java》是Bruce Eckel的经典编程教材,第四版更是深受程序员喜爱。这本书深入浅出地介绍了Java语言,强调了面向对象编程的核心概念。源代码TIJ4-code包含了书中所有示例程序,是读者实践和理解书本理论...

    tij4-code:java编程思想第四版-GIT

    《Java编程思想》第四版是 Bruce Eckel 的经典著作,这本书深入浅出地介绍了Java语言,深受广大开发者喜爱。"tij4-code:java编程思想第四版-GIT" 指的是该书的源代码已经托管在了Git版本控制系统中,方便读者查阅和...

    TIJ4-code_idea:Java 中的思考第 4 版练习题

    《Java编程思想第四版》(Thinking in Java 4th Edition)是 Bruce Eckel 所著的一本经典Java学习书籍,其配套练习题旨在帮助读者深入理解Java语言的核心概念和技术。"TIJ4-code_idea"项目是这本书的代码示例和练习...

    TIJ4-code:Java源代码中的Tink

    完成后,您应该看到几个级别的目录,并且在C:\TIJ4\code目录中,除其他外,您C:\TIJ4\code看到与本书各章相对应的子目录。 从的安装Java JDK SE5或更高版本。 您最终还将需要该文档,该文档可在该页面的后面找到。...

    TIJ4Reusing Classes

    thinking in java 4 Reusing Classes 读书笔记

    The_Thinking_in_Java_Annotated_Solution_Guide(TIJ4-solutions)

    对于有一定基础的读者来说,该书可能包含了一些高级主题、设计模式、最佳实践以及解决复杂编程问题的策略。 3. 版权信息:文档中包含了详细的版权信息,明确指出该书不是免费软件,不能在网站上发布、复制或分发。...

    tij4:java中的思考第四版

    《Thinking in Java》是Bruce Eckel的经典之作,第四版更是对Java编程的深入解析和思考。这本书涵盖了Java语言的基础到高级特性,旨在帮助读者全面理解Java编程思想,从而提升编程能力。现在,我们来深入探讨一下...

    tij.rar_VB控制_界面编程

    标题中的“tij.rar_VB控制_界面编程”暗示了这个压缩包可能包含与Visual Basic(VB)编程相关的资源,特别是关于如何在VB环境中进行界面设计和控件自适应调整的内容。描述中提到的“VB自动地调整VB控制的大小和一种...

    生产者消费者模型的演变

    生产者消费者模型是一种多线程同步的经典设计模式,它源于操作系统中的进程通信概念,用于解决资源的高效利用和协同工作问题。在这个模型中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。为了确保生产...

Global site tag (gtag.js) - Google Analytics