`
jokermanager
  • 浏览: 143849 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java的多线程及安全性

阅读更多

 

线程 是一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间相互独立。多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码 是乱序执行的。任何线程都有四种状态:产生(New),可执行(Runnable),阻塞(Blocked),死亡(Dead)。
1.Java 的多线程


在 Java中实现多线程有两种方法:第一种方法是继承Thread 类, 覆盖方法run()。即创建Thread类的子类并重写run()方法,加入线程所要执行的代码即可。种方法简单明了,但是它有一个很大的缺点,就是一个 类已经继承了另一个类(如小程序必须继承自Applet类),则无法再继承 Thread类。第二种方法是实现Runnable接口 。 Runnable接口只有一个方法run(),需要声明自己的类来实现Runnable接口并提供这一方法 ,将线程代码写入其中,就完成了这一部分的任务。但是Runnable接口并没有任何对线程的支持,我们还必须创建Thread类的实例,这一点是通过 Thread类的构造函数publicThread(Runnabletar-get)来实现的。


2.线程安全

线程安全 ,是指变量或方法 (这些变量或方法是多线程共享的)可以在多线程的环境下被安全有效的访问。这说明了两方面的问题:
(1)可以从多个线程中调用,无需调用方有任何操作; (2)可以同时被多个线程调用,无需线程之不必要的交互。事实上,线程安全是个很难达到的目标,这可以从类的状态上反映出来,归纳的说,类可分为五种状态:

2.1不可变

一个不可变的对象只要构建正确,其外部可见状态永远不会改变,永远也不会看到它处于不一致的状态。Java类库中大多数基本数值类如 Integer、String和 BigInteger都是原子性的,是不可变的,但 Long和 Double就不能保证其操作的原子性,可在声明变量的时候用volatile关键字。不可变对象上没有副作用,并且缓存不可变对象的引用总是安全的。一 个不可变的对象的一个引用可以自由共享,而不用担心被引用的对象要被修改。


2.2线程安全性类

即对这个类的对象操作序列(读或写其公有字段以及调用其公有方法)都不会使该对象处于无效状态,即任何操作都不会违反该类的任何不可变量、前置条件或者后置条件。


2.3有条件的线程安全类

有条件的线程安全类对于单独的操作可以是线程安全的,但是某些操作序列可能需要外部同步。为了保证其它线程不会在遍历的时候改变集合,进行迭代的线程应该确保它是独占性地访问集合以实现遍历的完整性。通常,独占性的访问是由对锁的同步机制保证的。


2.4线程兼容类

线程兼容类不是线程安全的,但可以通过正确使用同步从而在并发环境中安全地使用。或用一个synchronized 块包含每一个方法调用。


2.5线程对立类

线程对立类是那些不管是否调用了外部同步都不能在并发使用时保证其安全的类。线程对立类很少见,当类修改静态数据,而静态数据会影响在其它线程中执行的其它类的行为时,通常会出现线程对立。


3.多线程的优缺点

何时使用多线程技术,何时避免用它,是我们需要掌握的重要课题。多线程技术是一把双刃剑,在使用时需要充分考虑它的优缺点。
多线程处理可以同时运行多个线程。由于多线程应用程序将程序划分成多个独立的任务,因此可以在以下方面显著提高性能:
(1)多线程技术使程序的响应速度更快 ,因为用户界面可以在进行其它工作的同时一直处于活动状态;

(2)当前没有进行处理的任务时可以将处理器时间让给其它任务;

(3)占用大量处理时间的任务可以定期将处理器时间让给其它任务;

(4)可以随时停止任务;

(5)可以分别设置各个任务的优先级以优化性能。

是否需要创建多个线程取决于各种因素。在以下情况下,最适合采用多线程处理:
(1)耗时或大量占用处理器的任务阻塞用户界面操作;

(2)各个任务必须等待外部资源 (如远程文件或 Internet连接)。


同样的 ,多线程也存在许多缺点 ,在考虑多线程时需要进行充分的考虑。多线程的主要缺点包括:
(1)等候使用共享资源时造成程序的运行速度变慢。这些共享资源主要是独占性的资源 ,如打印机等。

(2)对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。当这种负担超过一定程度时,多线程的特点主要表现在其缺点上,比如用独立的线程来更新数组内每个元素。

(3)线程的死锁。即较长时间的等待或资源竞争以及死锁等多线程症状。

(4)对公有变量的同时读或写。当多个线程需要对公有变量进行写操作时,后一个线程往往会修改掉前一个线程存放的数据,从而使前一个线程的参数被修改;另 外 ,当公用变量的读写操作是非原子性时,在不同的机器上,中断时间的不确定性,会导致数据在一个线程内的操作产生错误,从而产生莫名其妙的错误,而这种错误 是程序员无法预知的。

4.结束语
在使用 Java多线程技术时,需要充分的考虑它的方方面面,包括创建线程、对多个线程进行调度和管理、多线程编程的复杂性以及线程切换开销等。多线程的核心是多 个代码块并发执行,本质特点在于各代码块是乱序执行的。是否需要多线程 ,就是要看这是否是它的内在特点。如果用户的应用程序需要多个任务同时进行相应的处理,则使用多线程是较理想的选择 ,需要注意的是在多线程编程时要特别小心处理资源共享问题。在编写类的时候必须记录线程安全性。在编写类时记录类的线程安全性访问的需求和行为可使线程安 全性的最初想法得以保留,使线程安全性记录成为类的说明的一部分。

分享到:
评论
1 楼 liujiaoshui 2010-07-14  
不错,说得挺全面的。

相关推荐

    java 多线程操作数据库

    ### Java多线程操作数据库:深入解析与应用 在当今高度并发的应用环境中,Java多线程技术被广泛应用于处理数据库操作,以提升系统的响应速度和处理能力。本文将基于一个具体的Java多线程操作数据库的应用程序,深入...

    Java多线程知识点总结

    Java多线程是Java编程语言中一个非常重要的概念...理解这些知识点对于解决并发编程中的问题,比如资源竞争、死锁、线程安全性等问题,至关重要。在实际开发中,正确地应用多线程机制可以显著提升程序的性能和用户体验。

    java多线程的讲解和实战

    Java多线程是Java编程中的重要概念,尤其在如今的多核处理器环境下,理解并熟练掌握多线程技术对于提高程序性能和响应速度至关重要。本资料详细讲解了Java多线程的原理,并提供了丰富的实战代码,非常适合Java初学者...

    基于Java多线程同步的安全性研究.pdf

    "基于Java多线程同步的安全性研究" 本文主要研究了基于Java多线程同步的安全性问题,讨论了Java多线程同步机制的实现方法和安全性问题的解决方法。文章首先介绍了Java多线程同步的必要性和重要性,然后讨论了Java多...

    java多线程处理数据库数据

    1. **线程安全**:由于多线程环境下可能存在数据竞争,所以在访问共享资源(如数据库连接)时,需要确保线程安全。可以使用`synchronized`关键字或者`Lock`来同步访问。 2. **事务管理**:在多线程环境中,可能需要...

    汪文君JAVA多线程编程实战(完整不加密)

    《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...

    java多线程安全性基础介绍.pptx

    java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 ...

    java 多线程并发实例

    - volatile:修饰变量,确保多线程环境下的可见性和有序性,但不保证原子性。在实例中,可能用于共享标志的设置与读取。 - wait()、notify()和notifyAll():这些方法存在于Object类中,用于线程间的通信。在线程A...

    JAVA单线程多线程

    通过以上分析,我们可以看到,在Java中合理利用单线程或多线程以及`synchronized`关键字能够有效地提高程序的性能和响应能力,同时也需要注意其可能带来的复杂性和资源消耗问题。开发者应根据具体的应用场景和需求来...

    JAVA多线程编程技术PDF

    总结起来,“JAVA多线程编程技术PDF”涵盖了多线程的基本概念、同步机制、线程通信、死锁避免、线程池以及线程安全的集合类等内容。通过深入学习这份资料,开发者可以全面掌握Java多线程编程技术,提升程序的并发...

    java多线程实现大批量数据导入源码

    本项目以"java多线程实现大批量数据导入源码"为题,旨在通过多线程策略将大量数据切分,并进行并行处理,以提高数据处理速度。 首先,我们需要理解Java中的线程机制。Java通过`Thread`类来创建和管理线程。每个线程...

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...

    Java多线程编程实战指南-核心篇

    《Java多线程编程实战指南-核心篇》是一本深入探讨Java并发编程的书籍,旨在帮助读者掌握在Java环境中创建、管理和同步线程的核心技术。Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高...

    Java多线程安全集合

    在Java编程中,多线程安全集合是程序员在并发环境下处理数据共享时必须考虑的关键概念。这些集合确保了在多个线程访问时的数据一致性、完整性和安全性,避免了竞态条件、死锁和其他并发问题。Java提供了一系列的线程...

    Java多线程练习题

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,多线程的实现主要通过两种方式:继承Thread类和实现Runnable接口。理解并掌握多线程的使用对于任何Java开发者...

    Java多线程技术精讲

    Java多线程技术是Java编程中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程是实现并发处理的关键技术,尤其在服务器端应用和高性能计算中不可或缺。 ...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    通过学习《Java多线程编程实战指南》,开发者不仅可以理解多线程的基本概念,还能掌握如何在实际项目中运用多线程技术,提升程序的并发性能和稳定性。无论是初级开发者还是经验丰富的工程师,这本书都是一本值得阅读...

    java多线程设计

    本知识点将深入探讨Java多线程设计以及如何利用“不可变对象”(immutable objects)来避免多线程环境中的非安全问题。 一、Java多线程基础 1. 线程的创建:Java提供了两种创建线程的方式——继承Thread类和实现...

    Java 多线程 订票 示例 线程安全

    总结起来,Java多线程在实现订票系统时,需要注意线程安全问题,通过合理使用同步机制、Lock接口和原子类,可以在保证数据一致性的同时提高并发性能。在实际开发中,要根据业务场景选择合适的线程安全策略,以达到...

Global site tag (gtag.js) - Google Analytics