1,并发的简短历史

1,OS的发展使多个程序同时运行,程序在各自的进程(process)中运行:相互分离,各自独立执行,有OS来分配资源,比如内存,文字句柄,安全证书。如果有需要的话,进程会通过一些原始的机制相互通信:Socket,signal handlers,shared memory,semaphores和文件

2,推动OS支持多程序同时执行发展的因素

a:资源利用。程序有时候需要等待外部操作,比如输入和输出,并且在等待的时候不可能进行有价值的工作。在等待的时候,让其他的程序运行会提高效率

b:公平。多个用户或程序可能对系统资源有平等的优先级别。让他们通过更好的时间片方式来共享计算机

c:方便。写一些程序,让他们各自执行一个单独的任务并进行必要的相互协调,这要比编写一个程序来执行所有的任务更加容易

3,冯诺依曼机(von Neumann):拥有一个内存空间,储存着着指令和数据,根据机器语言的语义来顺序地执行指令,并且通过OS的I/O原语集来实现与外部世界的交互。对于每一条执行的执行都有一个对“下一条指令”的明确定义,并根据程序中的指令集进行流程控制。

4,顺序编程模型是自然的,常规的就像遵守着人类的工作方式:一次做一件事情,顺序进行

5,相同的关注点(1.2中的a,b,c)不仅促进了进程的发展,也促进了线程的发展。线程允许程序控制流(control flow)的多重分支同时存在于一个进程。它们共享进程范围内的资源,比如内存和文件句柄,但是每一个线程有起自己的程序计数器(program counter),栈(stack)和本地变量。线程 也为多处理系统中并行地使用硬件提供了一个自然而然的分解,同一个程序内的多个线程可以在多cpu的情况下同时调度。

6,线程有些时候被称为轻量级进程,并且大多数操作系统把线程作为时序的调度的基本单元,而不是进程。在没有明确协调的情况下,线程相互间同时或异步的执行,因为共享其所属进程的内存地址空间,因此所有同一进程中相乘访问相同的变量,并从同一堆中分配对象,这相对于进程间通信机制来说实现良好的数据共享

2,线程的优点

1,可以降低开发和维护的开销

2,提高复杂应用的性能

3,可以把复杂,难以理解的代码转化为直接,简洁的代码,这样更加读写及维护

4,线程在GUI Application中是非常有用的,可以改进用户接口的响应性,并且在服务器中,用于提高资源的利用率和吞吐量。

5,简化JVM的实现,垃圾收集器通常运行于一个或多个持续的工作线程之间

###2.1,使用多处理器

注意:处理器很难提高它的时钟频率,处理器厂商会在一个芯片上放置更多的处理器内核。一个单线程的app一次只能运行在一个处理器上

在设计良好的情况下,多线程程序通过更有效的利用空闲的处理器资源,来提高吞吐量,也可以在单处理器上实现更加的吞吐量,如果一个程序是单线程的,这个处理器在等待一个同步I/O操作完成的时候,仍然是空闲的。在多线程中当第一个线程等待I/O结束的同时,另一个线程也可以运行,这样就使得应用程序在遇到I/O阻塞的时候仍然有进展

###2.2,模型的简化

一个复杂,异步的流程可以被分解为一系列简单同步流程,它们中每一个相互独立的线程中运行,只有在特定同步点才进行彼此间的交互

###2.3,对异步事件的简单处理

###2.4,用户界面的更佳响应性

3,线程的风险

java对线程内置的支持是一把双刃剑,它通过提供语言和类库,以及一个规范的跨平台存储模型,简化并发应用开发。线程安全的问题

###3.1,安全危险

线程安全问题是出乎意料的,因为在没有进行充分同步的情况下,多线程中的各个操作是不可预测的,biqu

@NotThreadSafe

public class UnsafeSequence {

private int value;

/**

* 返回一个唯一的值

*/

public int getNext() {

return value++;

}

}

UnsafeSequence 的问题是;在一些特殊的时序情况下,两个线程可以调用getNext()并得到相同的返回值 ,图1.1表现了如何发生的,value++:读取这个值,使之加1,再写入新值;所以两个线程都肯同时读取这个值,两个线程得到相同的值,并都使之增加1.结果就是返回了相同序列数。

UnsafeSequence阐明了一种常见的并发危险:竞争条件。当被多线程调用的时候,getNext是否能返回不重复的值,

因为线程共享相同的内存地址空间,且并发的运行,它们可能访问或修改其他线程正在使用的变量。这是非常方便的,因为它使得数据共享相对于其他的线程间通信机制更加简单。风险是:当数据意外改变的时候,线程可能会发生混乱。允许许多线程访问和修改相同的变量,给顺序编程模型引入一些非顺序因素,这可能会做成混乱,并且难以发现错误。

可以通过把getNext()声明为synchronize类型的方法来修正UnsafeSequence

线程安全的序列生成器

@ThreadSafe

public class UnsafeSequence {

@GuardedBy("this") private int value;

/**

* 返回一个唯一的值

*/

public synchronized int getNext() {

return value++;

}

}

注意:在缺少同步的时候,编译器,硬件和运行时对时间和活动顺序时很随意的,比如在寄存器或者高速缓存中存储变量,这样会使它们对于其他线程暂时不可见,这被认为提高性能的非常可行的方法,但是对开发人员来说,他们需要明确识别数据在线程中使究竟如何共享的,这样的优化才不至于破坏安全

###3.2,活跃度的危险

当一个活动进入某种它永远无法再继续执行的状态时,活跃度失败就发生了。一种活跃度失败可以发生在顺序程序中,这就是粗心造成的无限循环,那些循环之后的代码永远不会执行。多线程的引入带来更多活跃度危险。例如,如果线程A等待线程B独立占有的资源,B永远不是释放这个资源,A将永远等待下去。(引起活跃度失败的bug很难发现,因为取决于线程间相关的事件时序)

###3.3,性能的危险

性能问题涉及很多方面包括服务时间,响应性,吞吐量,资源消费或者可伸缩性的不良表现。

a,上下文切换(Context switches):当调度程序临时挂起当前运行的线程时,另一个线程开始运行-这在多线程组成的应用程序重视很频繁的,并且带来巨大的系统开销:保存和恢复线程执行的上下文,离开执行现场,并且CPU的时间花费在对线程的调度而不是在运行上。

b,当线程共享数据的时候,它们必须使用同步机制,这个机制会限制编译器的优化,能够清空或锁定内存和高速缓存,并且在共享内存总线上创建同步通信

4,线程无处不在

###4.1,即时你的程序没有显示的创建任何线程,框架也可能为创建一些线程,这些线程调用的代码必须是线程安全的(thead safe)(注意线程安全的类比非线程安全的类更加的仔细,进行更多分析)

###4.2,线程安全的需要并不仅仅在于框架调用的组件----只要它处于组件访问过的程序状态段,他就会扩展到所有的代码路径,因此,线程安全需要是具有传递性

注意:通过从框架线程中调用应用程序的组件,框架把并发引入应用程序。组件总是需要访问程序的状态。因此要求在所有代码路径访问状态时,必须是线程安全的。

以下描述的这些场景,都会引发非应用程序管理调用应用程序代码这种情况下,当需要线程安全的时候,可能会以这样的情况作为开始,可以这样做几乎都不能正常结束:反而会影响到整个程序。

1,定时器。Timer用来调度一些稍后运行的任务也可以是只运行一次或者周期性运行的任务,这是一种非常方便的机制。

注意:引入Timer可以使一个通常简单的顺序程序变得复杂

因为TimerTasks运行在由Timber管理的线程中,并不是由应用程序来管理。如果一个TimerTasks访问其他应用程序线程正在访问的数据,那么不仅TimerTask需要线程安全的手段,并且其他那些同时访问这个数据的类也需要相应的措施。通常最简单的实现方法是确保TimerTask访问的对象本身是线程安全的,因此将线程安全封装到共享对象的内部

2,Servlets and JavaServer Pages(JSPs)Servlets框架的涉及目的是处理Web应用的部署,分发来自远程HTTP客户的请求这些的基础层业务 。Servlets的规范规定了一个Servlet必须为多个用户同时调用它做好准备。换句话说Servlets应该是线程安全的

3,Remote Method Invocation使你能够调用在另外一个JVM上运行的对象的方法。当你使用RMI调用一个远程方法时,这个方法参数被装配成一个比特流,并且穿越整个网络到达远程JVM,在那里它会被解包并传递给远程方法

当RMI代码调用了你的远程对象时,这个调用发生在哪一个线程?你并不知道,但绝不是你创建的那个线程------你的对象被RMI管理的一个线程所调用。

一个远程对象必须守卫两种线程安全风险,对那些肯尼会域其他对象共享的状态进行适当的调节,应正确的对远程对象本身进行调控(因为相同的对象可能同时被多个线程调用),

4,Swing和AWT GUI应用程序具有固有的异步特性。

大道至简@EveryDay

发布了19 篇原创文章 · 获赞 2 · 访问量 477

私信

关注

标签:调用,java,安全,编程,程序,并发,线程,运行,###

来源: https://blog.csdn.net/qq_42511550/article/details/104155608

java并发编程介绍_java并发编程《一》介绍相关推荐

  1. java并发编程实践_Java并发编程实践如何正确使用Unsafe

    一.前言 Java 并发编程实践中的话: 编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各 ...

  2. java 编程原理_Java网络编程 -- 网络编程基础原理

    Hello,今天记录下 Java网络编程 --> 网络编程基础原理. 一起学习,一起进步.继续沉淀,慢慢强大.希望这文章对您有帮助.若有写的不好的地方,欢迎评论给建议哈! 初写博客不久,我是杨展 ...

  3. java编程源代码_java经典编程300例源代码下载

    java经典编程300例源代码是针对java编程的编程源代码.以基础知识为框架,介绍了各部分知识所对应的常用开发实例,并进行了透彻解代码解析和知识扩展4部分,每一部分都进行了细致的说明.__java经 ...

  4. java 网络编程 聊天_Java——网络编程(实现基于命令行的多人聊天室)

    目录: 1.ISO和TCP/IP分层模型 2.IP协议 3.TCP/UDP协议 4.基于TCP的网络编程 5.基于UDP的网络编程 6.基于TCP的多线程的聊天室的实现 1.ISO和TCP/IP分层模 ...

  5. java语言编程基础_java语言编程基础

    java语言基本要素 高级语言如c++.c#.java等都有一些共同性的东西:关键字.标识符. 运算符.注释.数据类型.常量和变量.语句.函数.数组.高级语言在这些要素上大同小异. Java关键字:一 ...

  6. java函数式编程例子_java函数式编程Lambda表达式的示例(一)

    函数式编程是时下比较流行的编程方式了,很多新兴的编程语言都对函数式编程有了比较好的支持,她有别于传统的命令式编程,可以将函数(执行代码的过程)作为参数进行传递.JAVA也意识到了函数式编程的重要性,在 ...

  7. java英语面试自我介绍_java面试英语自我介绍范文

    不论是高校还是进入职场,都免不了要经历自我介绍的环节,那么大家知道Java程序员是怎么用英文自我介绍吗?下面学习啦小编为大家带来java面试英语自我介绍范文,供大家参考! java面试英语自我介绍范文 ...

  8. java 关闭守护线程_Java并发编程之线程生命周期、守护线程、优先级、关闭和join、sleep、yield、interrupt...

    Java并发编程中,其中一个难点是对线程生命周期的理解,和多种线程控制方法.线程沟通方法的灵活运用.这些方法和概念之间彼此联系紧密,共同构成了Java并发编程基石之一. Java线程的生命周期 Jav ...

  9. java线程本地变量_Java并发编程示例(九):本地线程变量的使用

    这篇文章主要介绍了Java并发编程示例(九):本地线程变量的使用,有时,我们更希望能在线程内单独使用,而不和其他使用同一对象启动的线程共享,Java并发接口提供了一种很清晰的机制来满足此需求,该机制称 ...

最新文章

  1. 集成公司内部的多个子系统(兼容B/S和C/S),实现单点登录功能的多系统的统一入口功能...
  2. einsum,一个函数走天下
  3. python案例教程黄蔚答案_Python编程案例教程
  4. java有 号_JAVA揭竿而起总要有名号
  5. 六、区块链主流共识算法浅析
  6. linux oracle删除恢复数据恢复,Linux下Oracle误删除数据文件恢复操作
  7. Java基础篇(05):函数式编程概念和应用
  8. Python demjson 下载并安装
  9. shell脚本:编辑脚本check_host.sh,自动检测主机如下信息
  10. Road_slam论文阅读及理解
  11. C#日期格式参考小结
  12. Mina中的多项式承诺方案
  13. 如何开启电脑的远程开机和远程控制?
  14. 服务器、存储和网络设备介绍
  15. iOS之苹果和百度地图的使用
  16. windows下合并多个txt,文件
  17. SAP SD模块配置
  18. 计算机专业毕业论文java毕业设计开题报告SSM同学录[包运行成功]
  19. 【解决】ubuntu用vim编辑时退格键和上下左右键失灵的问题
  20. 码云上比较好的java项目

热门文章

  1. BurpSuite 的安装及配置
  2. 【COMP207 LEC16 17 18】
  3. 上传图片前限制图片比例大小格式
  4. Scss或Less中:global{...}的作用
  5. JPG和PNG深度对比解析
  6. 【智能合约审计】————11、MultiGamesToken
  7. Blender - 螺旋、细分、线框、置换、简单变形、布尔、顶点组、顶点接近权重 - 实现螺丝、灯泡、拧麻花、奶酪建模
  8. GNU GPL 和自由软件
  9. Vue开发微信小程序
  10. 【迅为资料上新】iTOP-3568开发板指南手册