`

多线程程序设计23个要点

阅读更多
1.多线程中有主内存和工作内存之分, 在JVM中,有一个主内存,专门负责所有线程共享数据;而每个线程都有他自己私有的工作内存, 主内存和工作内存分贝在JVM的stack区和heap区。

  2.线程的状态有'Ready', 'Running', 'Sleeping', 'Blocked', 和 'Waiting'几个状态,
'Ready' 表示线程正在等待CPU分配允许运行的时间。

  3.线程运行次序并不是按照我们创建他们时的顺序来运行的,CPU处理线程的顺序是不确定的,如果需要确定,那么必须手工介入,使用setPriority()方法设置优先级。

  4.我们无从知道一个线程什么时候运行,两个或多个线程在访问同一个资源时,需要synchronized

  5. 每个线程会注册自己,实际某处存在着对它的引用,因此,垃圾回收机制对它就“束手无策”了。

  6. Daemon线程区别一般线程之处是:主程序一旦结束,Daemon线程就会结束。

  7. 一个对象中的所有synchronized方法都共享一把锁,这把锁能够防止多个方法对通用内存同时进行的写操作。synchronized static方法可在一个类范围内被相互间锁定起来。

  8. 对于访问某个关键共享资源的所有方法,都必须把它们设为synchronized,否则就不能正常工作。

  9. 假设已知一个方法不会造成冲突,最明智的方法是不要使用synchronized,能提高些性能。

  10. 如果一个\"同步"方法修改了一个变量,而我们的方法要用到这个变量(可能是只读),最好将自己的这个方法也设为 synchronized。

  11. synchronized不能继承,  父类的方法是synchronized,那么其子类重载方法中就不会继承“同步”。

  12. 线程堵塞Blocked有几个原因造成:

  (1)线程在等候一些IO操作
  (2)线程试图调用另外一个对象的“同步”方法,但那个对象处于锁定状态,暂时无法使用。

  13.原子型操作(atomic), 对原始型变量(primitive)的操作是原子型的atomic. 意味着这些操作是线程安全的, 但是大部分情况下,我们并不能正确使用,来看看 i = i + 1 , i是int型,属于原始型变量:

  (1)从主内存中读取i值到本地内存.
  (2)将值从本地内存装载到线程工作拷贝中.
  (3)装载变量1.
  (4)将i 加 1.
  (5)将结果给变量i.
  (6)将i保存到线程本地工作拷贝中.
  (7)写回主内存.

  注意原子型操作只限于第1步到第2步的读取以及第6到第7步的写, i的值还是可能被同时执行i=i+1的多线程中断打扰(在第4步)。

  double 和long 变量是非原子型的(non-atomic)。数组是object 非原子型。

  14. 由于13条的原因,我们解决办法是:




class xxx extends Thread{
   //i会被经常修改
  private int i;

  public synchronized int read(){ return i;}

  public synchronized void update(){ i = i + 1;}

  ..........

  }



  15. Volatile变量, volatile变量表示保证它必须是与主内存保持一致,它实际是"变量的同步", 也就是说对于volatile变量的操作是原子型的,如用在long 或 double变量前。

  16. 使用yield()会自动放弃CPU,有时比sleep更能提升性能。

  17. sleep()和wait()的区别是:wait()方法被调用时会解除锁定,但是我们能使用它的地方只是在一个同步的方法或代码块内。

  18. 通过制造缩小同步范围,尽可能的实现代码块同步,wait(毫秒数)可在指定的毫秒数可退出wait;对于wait()需要被notisfy()或notifyAll()踢醒。

  19. 构造两个线程之间实时通信的方法分几步:
  (1). 创建一个PipedWriter和一个PipedReader和它们之间的管道;
  PipedReader in = new PipedReader(new PipedWriter())
  (2). 在需要发送信息的线程开始之前,将外部的PipedWriter导向给其内部的Writer实例out
  (3). 在需要接受信息的线程开始之前,将外部的PipedReader导向给其内部的Reader实例in
  (4). 这样放入out的所有东西度可从in中提取出来。

  20. synchronized带来的问题除性能有所下降外,最大的缺点是会带来死锁DeadLock,只有通过谨慎设计来防止死锁,其他毫无办法,这也是线程难以驯服的一个原因。不要再使用stop() suspend() resume()和destory()方法

  21. 在大量线程被堵塞时,最高优先级的线程先运行。但是不表示低级别线程不会运行,运行概率小而已。

  22. 线程组的主要优点是:使用单个命令可完成对整个线程组的操作。很少需要用到线程组。

  23. 从以下几个方面提升多线程的性能:

  检查所有可能Block的地方,尽可能的多的使用sleep或yield()以及wait();

  尽可能延长sleep(毫秒数)的时间;

  运行的线程不用超过100个,不能太多;

  不同平台linux或windows以及不同JVM运行性能差别很大。多线程程序设计23个要点
分享到:
评论

相关推荐

    读书笔记:多线程程序设计23个要点

    读书笔记:多线程程序设计23个要点,非常受用!

    Java技巧:多线程程序设计二十三个要点

    本文介绍了Java的多线程程序设计的二十三个要点。

    多线程程序设计(文档)

    很有用的一个多线程程序文档,很详细讲述了多线程的操作和要点^_^

    Java程序设计习题集下载

    第8章 多线程程序设计 第9章 编程规范 第10章 网络程序设计 第11章 多媒体与图形学程序设计 第12章 数据库程序设计 第二部分 参考答案 第1章 绪论 第2章 结构化程序设计 第3章 面向对象程序设计 第4章 数组、字符串...

    Windows程序设计实验五.doc

    解读并分析教材第三章3.5多线程文件搜索器的例子:03RapidFinder,了解和掌握多线程开发的要点和运行的方式,根据分析结果绘制出类图和流程图。 1、 将程序当中定义的所有类绘制对应的类图,并标注类之间的关系; 2...

    JAVA程序设计习题集

    习题集内容覆盖面广,包括:Java言的基本常识、基本语法、面向对象的基本概念、数组、字符串、异常处理、文件和数据流、图形用户界面设计、小应用程序、线程、编程规范、网络程序设计、多媒体民图形学程序设计以及...

    多线程下载技术论文.rar

    线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开起好几个下载通道.当服务器提供下载服务时,使用下载者是共享带宽的,在优先级相同的情况下,总服务器会对总下载线程进行平均分配.线程越...

    Visual C++程序设计教程与上机指导(PDF)

    深入浅出地介绍了Visual C++编程技术的各个要点知识,首先介绍了Visual C++开发环境,并概要性地介绍了基于MFC的应用程序,然后以实例的形式对图形和文本输出、对话框和Windows标准控件、菜单、工具栏、状态栏、文档...

    C#程序设计与课件案例教程

    全书共分九章,按C#知识的系统性,由浅入深安排内容,全面介绍了C#语言基础,面向对象程序设计,GUI程序设计,图形、图像与多媒体,数据库程序设计,流和文件,线程,网络程序设计以及ASP.NET。每部分内容既有示例又...

    java互动媒体程序设计本科期末作业飞机大战小游戏源码.zip

    java互动媒体程序设计本科期末作业飞机大战小游戏源码。技术要点: 双缓冲:建立一个次画面,在次画面完成刷屏,之后将次画面贴到主画面上解决画面闪烁问题。 类封装、继承、多态机制 多线程:通过接口调用实现...

    java互动媒体程序设计-期末作业飞机大战小游戏源码+文档.zip

    java互动媒体程序设计-期末作业飞机大战小游戏源码+文档。纯手打高分项目。 技术要点: 双缓冲:建立一个次画面,在次画面完成刷屏,之后将次画面贴到主画面上解决画面闪烁问题。 类封装、继承、多态机制 多线程...

    77G 22套C语言 C++ 数据结构 程序设计视频课程合集 C丨C++相关学习视频全套视频教程

    3.MFC_第一个MFC程序设计.mp4 30.MFC_CButton类.mp4 31.MFC_E_FontView-1.mp4 32.MFC_E_FontView-2.mp4 33.MFC_CEdit类.mp4 34.MFC_MyPad.mp4 35.MFC_对话框_静态文本_编辑框.mp4 36.MFC_对话框_访问控件_7...

    Linux多线程服务端编程:使用muduo C++网络库

    3.5.3适用多线程程序的场景. . . . . . . . . . . . . . . . .. . . . . . . 71 3.6“多线程服务器的适用场合”例释与答疑.. . . . . . . . . . . . . . . . . 74 第4章C++ 多线程系统编程精要83 4.1基本线程原语的...

    Visual C++通用范例开发金典 源码

    内容包括与文档应用程序设计、图形程序设计、文件I/O与串行化程序设计、多媒体程序设计、系统控制与注册表、数据库技术程序设计、网络、通信技术程序设计、打印程序设计、线程和进程程序设计、动态链接库和ActiveX...

    Visual c++通用范例开发金典 韦朴 源代码

    内容包括与文档应用程序设计、图形程序设计、文件I/O与串行化程序设计、多媒体程序设计、系统控制与注册表、数据库技术程序设计、网络、通信技术程序设计、打印程序设计、线程和进程程序设计、动态链接库和ActiveX...

    二十三种设计模式【PDF版】

    之道 》,其中很多观点我看了很受启发,以前我也将"设计模式" 看成一个简单的解决方案,没有从一种高度来看待"设计模式"在软 件中地位,下面是我自己的一些想法: 建筑和软件某些地方是可以来比喻的 特别是中国传统建筑...

    Visual C++范例大全

    对话框程序设计(29个实例);文本输出与屏幕绘图(28个实例);文档/视图框架体系(30个实例);打印、帮助、调试与发布(20个实例);文件操作与注册表编程(34个实例);进程与线程(21个实例);DLL开发与系统...

    Big_Java(英文版)

    这四个部分分别介绍了Java的基本数据类型、类、继承、多态、数组、数组列表等概念,图形编程、基于对象编程和面向对象编程等内容,递归、排序和查找、链表和散列表等数据结构与算法,以及很多高级Java编程技术,包括...

Global site tag (gtag.js) - Google Analytics