`
nakata_yf
  • 浏览: 111779 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

线程的困惑~!!

阅读更多
当sleep中的线程被调用interrupt()时,就会放弃暂停的状态,(sleep线程)并抛出InterruptedException异常。
当对wait中的线程调用interrupt()时,(wait线程)会先重新获得锁定,在抛出InterruptedException异常。
当join(等待其他线程结束)的线程被调用interrupt()时,就会放弃等待状态,(join线程)并抛出InterruptedException异常。
interrupt()方法只会改变被interrupt的线程的中断状态(interruptstatus)而已。
线程在执行sleep、wait、join时,是在这些方法内不断检查interruptstatus的值,如果true了,则自己抛出InterruptedException。
如果在线程还没有执行sleep、wait、join前,就去interrupt它,并不会影响它的正常工作,只有它执行到sleep、wait、join时,才马上抛出InterruptedException。
------------------------------------------------------------------------------------
在进一步阐述之前,我们需要明确几点:

A.无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。

B.每个对象只有一个锁(lock)与之相关联。

C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。

接着来讨论synchronized用到不同地方对代码产生的影响:


假设P1、P2是同一个类的不同对象,这个类中定义了以下几种情况的同步块或同步方法,P1、P2就都可以调用它们。


1. 把synchronized当作函数修饰符时,示例代码如下:

Public synchronized void methodAAA()

{

//….

}

这也就是同步方法,那这时synchronized锁定的是哪个对象呢?它锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中执行这个同步方法时,它们之间会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以任意调用这个被加了synchronized关键字的方法。

上边的示例代码等同于如下代码:

public void methodAAA()

{

synchronized (this) // (1)

{

//…..

}

}

(1)处的this指的是什么呢?它指的就是调用这个方法的对象,如P1。可见同步方法实质是将synchronized作用于object reference。――那个拿到了P1对象锁的线程,才可以调用P1的同步方法,而对P2而言,P1这个锁与它毫不相干,程序也可能在这种情形下摆脱同步机制的控制,造成数据混乱:(

2.同步块,示例代码如下:

public void method3(SomeObject so)

{

synchronized(so)

{

//…..

}

}

这时,锁就是so这个对象,谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时,就可以这样写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁:

class Foo implements Runnable

{

private byte[] lock = new byte[0]; // 特殊的instance变量

Public void methodA()

{

synchronized(lock) { //… }

}

//…..

}

注:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码。
分享到:
评论

相关推荐

    VC++在线程中创建并显示窗口

    VC++在线程中创建并显示窗口,从线程函数开始全用windows API完成,让你不再受封装的困惑。每点一个按钮就创建一个线程,多个线程可显示多个窗口。好的话别忘了给个评论。

    让CPU拥有超线程能力

    这是一个让能让你的老爷CPU拥有超线程能力的不错的软件,可防止,一些主板和CPU工作假死,造成的困惑。

    Python实现的多线程端口扫描工具分享

    昨晚今晚写了两晚,总算把Py Port Scanner 写完了,姑且称之为0.1版本,算是一个Python多线程端口扫描工具。 水平有限,实话中间有一些困惑和不解的地方,代码可能也写的比较乱。有些问题并未找到很好的解决方法,还...

    team-mgmt:IPFS团队规划,管理和协调线程

    IPFS团队规划,管理和协调线程 tl:dr:我们每周一打个电话。 中的宣布了每周通话的时间,日期和其他信息。 通过对此问题发表评论,提出电话会议议程!回购指数同步通讯每周动手工作组每周/每两周同步日历聊天工作...

    详解C++中的内存同步模式(memory order)

    原子变量同步是内存模型中最让人感到困惑的地方.原子(atomic)变量的主要作用就是同步多线程间的共享内存访问,一般来讲,某个线程会创建一些数据,然后给原子变量设置标志数值(译注:此处的原子变量类似于一个flag);其他...

    jimutmap:API可通过多线程从Apple谷歌地图中快速获取大量高分辨率卫星图像! 创建您自己的地图数据集的地图。

    jimutmap 目的 这会手动强行使用 。 然后,它会按照用户提供的参数刮取所有图块(图像和道路...如果您对文档感到困惑,请观看此视频,以观看实际使用中的的抓取操作,以。 安装 sudo pip install jimutmap 下载的图像样

    DeltaTimerExecutor:DeltaTimer支持池线程执行

    我很惊讶使用C ++ 11来实现它很容易,而让Chrono感到困惑并且感到好像不应该受到支持(这是霍华德·辛南特(Howard Hinnant)的日期库(一个.h文件)出现在我的脑海中)引起的,这让我感到惊讶。救援) 核心机制是...

    Gmail Conversation Thread Reversal by cloudHQ-crx插件

    您是否对Gmail如何显示您的电子邮件会话线程感到困惑? 你不是一个人。 因此,我们创建了Gmail会话线程冲销,因此您可以在电子邮件线程的顶部而不是底部看到会话的最新电子邮件。 单击按钮,您可以反转电子邮件主题...

    python3.5从零开始学电子书

    内容包括:Python语言的类型和对象、操作符和表达式、编程结构和控制流、函数、序列、多线程、正则表达式、面向对象编程、文件操作、网络编程、邮件收发、数据库操作等,提供Python爬虫、数据处理项目范例,各章还...

    Python3.5从零开始学

    《Python 3.5从零开始学》专门针对Python新手量身定做,涵盖了Python 3 实际开发的重要知识点,内容包括:Python语言的类型和对象、操作符和表达式、编程结构和控制流、函数、序列、多线程、正则表达式、面向对象...

    Thinking C++[C++编程思想][第1版和第2版

    荣获1996年度《软件开发》杂志的图书震撼大奖 (Jolt Award),成为该年度最佳图书。 本书内容: ·介绍实用的编程技术和最佳的实践... ·介绍被认为是标准C++下一版特征之一的多线程处理编程技术,并提供最新研究成果

    python3.5从零开始学刘宇宙

    本书专门针对Python新手量身定做,涵盖了Python 3 实际开发的重要知识点,内容包括:Python语言的类型和对象、操作符和表达式、编程结构和控制流、函数、序列、多线程、正则表达式、面向对象编程、文件操作、网络...

    python3.5从零开始学

    本书专门针对Python新手量身定做,涵盖了Python 3 实际开发的重要知识点,内容包括:Python语言的类型和对象、操作符和表达式、编程结构和控制流、函数、序列、多线程、正则表达式、面向对象编程、文件操作、网络...

    《Python 3.5从零开始学》刘宇宙 mobi

    《Python 3.5从零开始学》专门针对Python新手量身定做,涵盖了Python 3 实际开发的重要知识点,内容包括:Python语言的类型和对象、操作符和表达式、编程结构和控制流、函数、序列、多线程、正则表达式、面向对象...

    C++编程思想 第2卷:实用编程技术(Bruce Eckel著)

    ·介绍被认为是标准C++下一版特征之一的多线程处理编程技术,并提供最新研究成果 ·对书中包含的所有示例代码都提供免费下载,这些代码段经过多个软件平台和编译器(包括基于Windows/Mac/Linux的GNU C++编译器) 的...

    张孝祥Java就业培训教程.pdf

    作者从事了多年的软件开发和培训教学,非常清楚那些容易使新手困惑的问题,在学习过程中会碰到的拦路虎,作者结合了多年实际开发与教学经验,收集了众多学员在学习中常提到的问题,对平时讲课的内容进行了精心整理。...

    Windows黑客编程基础

    前几天在网上看了“病毒”兄写的《WIN下编程须知》一文,觉得在编程方面要写出一篇适合初学者们看的入门级文章的确很重要,可惜病毒兄只在该文里介绍了线程、消息、句柄等几个基本概念。很多初学者看了对编程还是...

    《Java 就业培训教程》张孝祥 pdf part 2重新上传

    在以后的章节中,作者始终以“启发编程思想,培养编程感觉”为指导,以剖析典型实例、分析源码结构含义、解析常见问题等方式,从高屋建瓴的角度,用通俗易懂的文字,讲解了多线程、常用Java类、Java中的I/O(输入...

    《Java 就业培训教程》张孝祥 pdf part 1重新上传

    在以后的章节中,作者始终以“启发编程思想,培养编程感觉”为指导,以剖析典型实例、分析源码结构含义、解析常见问题等方式,从高屋建瓴的角度,用通俗易懂的文字,讲解了多线程、常用Java类、Java中的I/O(输入...

Global site tag (gtag.js) - Google Analytics