前一章中,介绍了许多基础知识:如何创建、启动、终结、命名线程、监控生命周期,等等。然而,那一章的例子讲解的线程或多或少是独立的:在它们之间不需要共享数据。
但在有些例子中,我们需要让一个线程能够做出判断:其他线程是否完成了它们的任务(也就是那个done标记)。在其他例子中,我们需要改变被用在动画canvas中的字符变量;这是由一个不同于重画canvas的Swing线程的一个线程完成的。当时,我们掩饰了细节,这可能会给你一个暗示它们不重要。然而,我们必须要理解,就是当2个线程共享数据时,复杂度会增加。不管我们是正在实现一个大型共享数据库还是仅仅共享一个done标记,这些复杂性必须要考虑。
本章将讨论线程间共享数据的问题。线程间共享数据会变得麻烦,就是因为竞争条件会同时(也就是并发)地访问相同的数据。将学习什么是竞争条件,如何解决它呢?
3.1、Synchronized关键字
线程间没有竞争条件的原因是对象中没有数据被共享。然而,其他线程会调用该对象的方法。这种情况下,就会有一个竞争条件。调用newCharacter()方法的线程和调用paintComponent()方法的线程会访问相同的数据。随机字符生成线程可能会修改字符(但这个时候event-dispatching线程正在使用该字符)。这2个线程还会修改X location。
竞争条件存在的原因是paintComponent()和newCharacter()方法不是atomic的。稍后我们将详细介绍竞争条件,现在我们只需要理解竞争条件会产生不同的结果,包括依赖于执行顺序产生的不在预料中的结果。
对Atomic的解释:atomic一词与原子有关,曾经被认为是物质的最小单元,不能再被拆分成独立的部分。当计算机代码被认为是atomic的时候,在它的执行过程中,它就不能被中断。这可以由硬件或软件模拟来实现。通常,硬件提供atomic指令,然后软件用它来实现atomic方法。
Java语言提供了synchronized关键字;和其他threading系统相比,该关键字可以让程序员访问一个资源(和mutex lock非常类似)。它对我们的作用,仅仅是阻止2个或更多个线程在同一时间调用同一对象上的方法。
Java中,每个对象都有一个与它相关联的锁。当一个方法被声明为synchronized,执行线程就必须获取该对象的锁才能继续做事。方法完成后,锁就自动释放了。不管方法是如何返回的,包括通过异常,锁都会被释放。
3.2、Volatile关键字
在这个例子中,实际上还有一个线程问题,并且是与setDone()方法有关。该方法是从event-dispatching线程中被调用的,就是当Stop按钮被按下时;它是被一个事件处理器调用的(就是一个actionPerformed()方法),该事件处理器是SwingTypeTester类的一个内部类。这里的问题就是该方法会改变正在被另一个线程用的数据:done标记,它被AnimatedDisplayCanvas类的线程在访问。
因此,我们不能仅仅同步这2个方法,就像我们之前那样?是的但也不是。是的,java的synchronized关键字可以解决该问题。但不是,目前我们学到的技术还不能正常工作。原因呢,和run()方法有关。如果我们对run()和setDone()方法都进行了同步,setDone()方法又如何在什么时候执行呢?run()方法不会退出,直到done标记被设置,但done标记不能被设置,因为setDone()方法只能直到run()方法完成后才能执行。
未完。。。。。。。。。。。。。。。。
相关推荐
管程是一种高级的进程同步机制,它提供了一个包含共享数据结构和控制结构的封装体,使得多个进程可以安全地访问和修改共享数据。 AND信号量是一种特殊的信号量,它的值减操作只有在值大于零时才真正进行,从而能够...
"操作系统第三章进程同步与通信" 在计算机操作系统中,进程同步与通信是两个非常重要的概念。进程同步是指多个进程之间的协作,包括进程互斥、进程同步和进程通信三个方面。下面我们将详细介绍这三个方面的知识点。...
这些文件是关于Java语言程序设计与数据结构课程的第三章编程练习题目,涵盖了多个不同的练习题目,用于帮助学习者深入理解和应用数据结构的基本概念。以下是根据文件名推测出的一些可能的编程题知识点: 1. **...
第6章多媒体同步主要探讨了多媒体数据的特性、同步的重要性以及多媒体同步的理论与方法。在多媒体领域,同步是指确保不同媒体元素按照预设的时间基准协调一致地呈现,以保证内容的完整性和用户体验。 首先,多媒体...
本文将深入讲解C语言版《数据结构》第八章中涉及的排序算法,包括归并排序、交换排序(快速排序和冒泡排序)、插入排序、选择排序以及它们之间的比较。 一、归并排序 归并排序是一种分治策略的体现,它将大问题分解...
《Programming with POSIX threads》第三章主要探讨了在多线程编程中如何实现线程同步,这是确保并发程序正确性和性能的关键。POSIX线程(也称为pthreads)是Linux和其他类Unix系统中广泛使用的线程API,它为开发者...
数据链路层的”链路管理”功能包括数据链路的建立、维持和释放三个主要方面。当网络中的两个节点要进行通信时,数据的发送方必须确知接收方是否已处在准备接收的状态。为此通信双方必须先要交换一些必要的信息,以...
本资源包含了计算机网络第三章数据链路层的知识点,涵盖了数据链路层的作用、数据链路层的功能、帧同步、透明传输、HDLC 协议、滑动窗口协议、ARQ 协议等重要概念。 一、数据链路层的作用 数据链路层最重要的作用...
**第三章:不同场景的最佳实践** TDSQL的灵活性使其能够适应各种业务场景,如电商的实时订单同步、金融行业的实时交易数据分发、大数据分析中的实时数据集成等。最佳实践通常包括对数据流量的预测、合理的资源分配...
第三章同步通信与死锁是计算机科学中一个重要的概念,涉及到多个进程之间的相互关系和协作。 在多道程序的环境中,系统中的多个进程可以并发执行,同时它们又要共享系统中的资源,由此诸进程间会产生错综复杂的相互...
《第三章 同步通信与死锁》\n\n在多道程序设计环境中,进程的同步与互斥是操作系统中至关重要的概念。这些概念源于进程间对于系统资源的竞争与协作,这种错综复杂的相互关系使得进程执行变得复杂而微妙。\n\n首先,...
### 知识点总结 ...以上是对《算法与数据结构 分布式算法课程 第10章 同步化器》的主要知识点的总结,涵盖了同步化器的基本概念、设计方法以及理论依据等内容。这些知识点对于理解和应用分布式算法具有重要意义。
计算机网络HEU第三章数据链路层 数据链路层是计算机网络OSI七层模型中的第二层,负责在相邻节点之间提供可靠的数据传输服务。本章主要讨论数据链路层的基本概念、协议、和技术。 3.1 使用点对点信道的数据链路层 ...
计算机网络课件:第三章 数据链路层 数据链路层是计算机网络的第二层,负责在物理层提供的服务基础上,对数据进行封装、同步、流量控制、差错控制、寻址等处理,使得数据在物理链路上传输变得可靠。数据链路层的...
第三章 数据链路层习题答案 3-01 数据链路(即逻辑链路)与链路(即物理链路)有何区别? 答案:数据链路与链路的区别在于数据链路外,还必须有一些必要的规程来控制数据的传输,因此,数据链路比链路多了实现通信...
在第3章中,我们将深入探讨这一主题,尤其是如何利用信号量、AND信号量以及管程来解决进程间的同步和互斥问题。 首先,进程同步是指协调多个进程的执行顺序,确保它们正确、有效地共享资源,避免产生竞态条件。而...
谢希仁的《计算机网络》(第五版)是该领域的一本经典教材,本文将对第三章的习题进行解答,内容涵盖数据链路层、链路控制、网络适配器、链路层的三个基本问题、PPP 协议等。 3-01 数据链路和链路的区别在于数据...
《张宪超数据结构第二章02》是关于C++数据结构的学习资源,主要涵盖了数据结构这一核心计算机科学概念的深入探讨。在本章节中,我们将会深入理解数据结构的基本概念,以及C++中实现这些数据结构的方法。下面将详细...