Java并发编程实战--简介

简介: Java并发编程实战--简介

Java并发编程实战--简介

      导读:在Java编程中,编写正确的并发编程本身就是一件难事,与串行程序相比,并发程序很容易出错。在Java中如何编写Java并行的编程呢--线程。线程可以使复杂的程序变得简单,简化复杂程序的系统开发。处理器的增多,高效的使用并发变得尤为重要。

    一、简介

1.1并发简史

    在最初的计算机中,计算机只有一个主线程(原因是没有操作系统),运行所有的程序都是这样,在这样的环境之下,系统运行不仅受到了限制,而且对于计算机本事来说,更是一种资源的浪费。

   操作系统的出现,使现在的电脑开始拥有了多线程,多个程序之间相互独立。操作系统为多个正在执行的进程进行独立分配,,其中包括内存、文件句柄、安全证书。如果需要的话,不同的进程之间,会有一些粗粒度的通信机制来交换数据,如:套接字、信号处理器、共享内存、信号量、文件。

   计算机中加入操作系统实现多个程序同时执行,目的:

   资源利用率--当程序同时进行两个时,必须进行一个等待另外一个,多线程无疑解决了这个问题。

   公平性--不同的用户和程序对于计算机上的资源拥有这相同的使用权利,一种高效的运行方式,是通过粗粒度的时间分片使这些用户和程序共享计算机资源,不是一个程序从开始到结束,然后再启动下一个程序。

   便利性--编写多个程序,在执行一个任务的时候可以互相通信。

   线程,也被成为轻量级进程,如果没有明确的协同机制,那么线程,将彼此独立执行。由于同一个进程中,所有的线程都将共享同一个进程的内存空间,因此这些线程都将在同一个堆上分配对象。这就需要实现一种比进程间共享数据粒度数据更细的    数据共享机制。如果没有明确的同步机制协同对数据的访问,那么当一个线程正在使用一个变量的时候,另一个线程可能同时访问这个变量,这就是一个非常有必要解决的问题。

1.2线程的优势

A. 有效的降低程序的开发和维护成本,提高复杂应用程序性能。

B. 线程可以将大部分的异步工作流转换成串行工作流,模拟人类的工作方式和交互方式。

C. 降低代码复杂度。

D. 在服务器应用程序中,提升资源利用率以及系统吞吐量,简化JVM实现--因为JVM实现用到了专门的线程。

1.2.1  发挥多处理器的强大性能

   由于基本的调度单位是线程,如果程序中只有一个线程,则最多在一个处理器上运行。在双处理器系统上,单线程的程序只能使用一半的系统资源,那么若是在一百核处理器,99%资源将无法使用。程序设计正确,就可以节省资源,提高利用率。

   同时,多线程可以同时完成多个状态例如同步I/O流操作时,另外一个可以继续运行。

1.2.2建模的简单性

    如果为模型中每一个任务都分配一个线程,那么可能形成一种串行执行的假象。通过使用线程,可以将复杂并且异步的工作流进一步分解为简单而且同步的工作流,每一个工作流在一个单独的线程中运行,并在特定的同步位置交换。

   我们可以使用一些特定的框架来实现这一些细节,例如:servlet和RMI(远程方法调用),他们可以实现细节如线程创建、请求管理、负载均衡,并在正确的时刻将请求分配给正确的应用组件。编写servlet的编程人员不需要知道同一时刻有多少请求被处理,也不需要了解套接字的输入流或输出流是否被阻塞。当调用servlet的service方法请求Web时可以以同步方式来处理这个请求,就好像是一个单线程程序。

1.2.3异步事件的简化处理

服务器在接受多个远程客户端套接字请求时,为每个链接都分配了其各自线程,并且使用同步I/O,则降低这类程序的开发难度。如果程序对套接字的执行读操作还没有来到,读操作则一直被阻塞,直到数据到达。在单线程中,这不仅意味着处理请求的过程中将停顿,而且还意味着在线程被阻塞期间,所有请求的处理将被停顿。处理这一类问题,在单线程中必须使用非阻塞I/O,而非阻塞I/O的复杂度远远高于阻塞I/O,容易出错。

    现在的操作系统,线程的数量已经得到很大的提升,在很多的客户端,每一个分配一个线程,也是可行的。

1.2.4响应更灵敏的用户界面

    在现在的GUI框架中例如AWT和Swing框架,采用了事件分发线程。当某个用户界面事件发生时,在事件线程中,将调用应用程序的事件处理器。由于大多数的GUI框架都是单线程子系统,因此目前为止,任然存在主事件循环,但现在在GUI 控制下并在自己的线程中运行,而不是在应用程序的控制下。

1.3线程带来的风险

     Java对多线程的支持其实是一把双刃剑,Java提供了相应的语言和库,以及明确的跨平台内存模型--该模型实现了Java来发“编写一次随处运行”并发应用模型,简化了开发,提高了编程人员的要求。

1.3.1  安全性问题

首先我们看一段代码:

在图中可以看到,如果两个线程同时访问方法getNext,就会得到相同的值。

解决办法:那么我们就可以将这个方法改为一个同步的方法。

如果没有同步,那么无论是编辑器,硬件还是运行时,都可以随意安排操作的执行时间和顺序,例如寄存器或处理器变量进行缓存,这些缓存的变量相对于其他线程来说暂时(甚至)永久是不可见的。虽然这些技术有助于实现跟优秀的性能,并且也是只得采用的方法,但也会带来负担,需要知道哪一些会被多个线程共享。不破坏线程安全性。

1.3.2线程活泼性

例如线程A等待线程B释放其特有资源,然而线程B 却一直不释放,那么A将永远等待下去。在以后的文章中会解释这样的事情如何避免。

目录
相关文章
|
8天前
|
存储 缓存 监控
Java面试题:在Java中,对象何时可以被垃圾回收?编程中,如何更好地做好垃圾回收处理?
Java面试题:在Java中,对象何时可以被垃圾回收?编程中,如何更好地做好垃圾回收处理?
19 0
|
3天前
|
缓存 监控 Java
Java虚拟机(JVM)性能调优实战指南
在追求软件开发卓越的征途中,Java虚拟机(JVM)性能调优是一个不可或缺的环节。本文将通过具体的数据和案例,深入探讨JVM性能调优的理论基础与实践技巧,旨在为广大Java开发者提供一套系统化的性能优化方案。文章首先剖析了JVM内存管理机制的工作原理,然后通过对比分析不同垃圾收集器的适用场景及性能表现,为读者揭示了选择合适垃圾回收策略的数据支持。接下来,结合线程管理和JIT编译优化等高级话题,文章详细阐述了如何利用现代JVM提供的丰富工具进行问题诊断和性能监控。最后,通过实际案例分析,展示了性能调优过程中可能遇到的挑战及应对策略,确保读者能够将理论运用于实践,有效提升Java应用的性能。 【
27 10
|
8天前
|
Java 测试技术 开发者
Java面试题:解释CountDownLatch, CyclicBarrier和Semaphore在并发编程中的使用
Java面试题:解释CountDownLatch, CyclicBarrier和Semaphore在并发编程中的使用
30 11
|
4天前
|
Java 调度 开发者
Java中的并发编程:从基础到高级
【7月更文挑战第14天】在Java的世界中,并发编程是提升应用性能和响应能力的关键。本文将带领读者从线程的基础概念出发,深入探讨Java内存模型,逐步过渡到高级并发工具类如Executors框架和并发集合,最后通过案例分析展示如何在实际开发中运用这些知识解决并发问题。文章旨在为初学者提供清晰的学习路径,同时为有经验的开发者提供深度参考。
13 4
|
4天前
|
安全 Java 开发者
Java并发编程中的线程安全性与性能优化
在Java编程中,处理并发问题是至关重要的。本文探讨了Java中线程安全性的概念及其在性能优化中的重要性。通过深入分析多线程环境下的共享资源访问问题,结合常见的并发控制手段和性能优化技巧,帮助开发者更好地理解和应对Java程序中的并发挑战。 【7月更文挑战第14天】
|
7天前
|
设计模式 测试技术 Python
《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
【7月更文挑战第10天】Page Object Model (POM)是Selenium自动化测试中的设计模式,用于提高代码的可读性和维护性。POM将每个页面表示为一个类,封装元素定位和交互操作,使得测试脚本与页面元素分离。当页面元素改变时,只需更新对应页面类,减少了脚本的重复工作和维护复杂度,有利于团队协作。POM通过创建页面对象,管理页面元素集合,将业务逻辑与元素定位解耦合,增强了代码的复用性。示例展示了不使用POM时,脚本直接混杂了元素定位和业务逻辑,而POM则能解决这一问题。
25 6
|
4天前
|
监控 Java API
Java并发编程之线程池深度解析
【7月更文挑战第14天】在Java并发编程领域,线程池是提升性能、管理资源的关键工具。本文将深入探讨线程池的核心概念、内部工作原理以及如何有效使用线程池来处理并发任务,旨在为读者提供一套完整的线程池使用和优化策略。
|
7天前
|
存储 安全 算法
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第72天】 在现代软件开发中,尤其是Java应用开发领域,并发编程是一个无法回避的重要话题。随着多核处理器的普及,合理利用并发机制对于提高软件性能、响应速度和资源利用率具有重要意义。本文旨在探讨Java并发编程的核心概念、线程安全的策略以及性能优化技巧,帮助开发者构建高效且可靠的并发应用。通过实例分析和理论阐述,我们将揭示在高并发环境下如何平衡线程安全与系统性能之间的关系,并提出一系列最佳实践方法。
|
4天前
|
Java 开发者
Java并发编程中的锁机制与性能优化
【7月更文挑战第14天】本文深入探讨了Java中锁的概念、种类及其在并发编程中的应用,并分析了不同锁类型对程序性能的影响。通过实例展示了如何合理选择和使用锁来提升应用的性能,同时指出了锁使用过程中可能遇到的问题和调优策略。旨在为Java开发者提供锁机制的深入理解和性能优化的实用建议。
|
8天前
|
Java 数据格式
Java面试题:简述Java Socket编程的基本流程,包括客户端和服务器的创建与通信。
Java面试题:简述Java Socket编程的基本流程,包括客户端和服务器的创建与通信。
12 0