Java多线程与静态方法
在多线程中使用静态方法会发生什么事?也就是说多线程访问同一个类的static静态方法会发生什么事?是否会发生线程安全问题?
public class Test { public static void operation(){ // ... do something } }
事实证明只要在静态函数中没有处理多线程共享数据,就不存在着多线程访问同一个静态方法会出现资源冲突的问题。下面看一个例子:
public class StaticThread implements Runnable { @Override public void run() { // TODO Auto-generated method stub StaticAction.print(); } public static void main(String[] args) { for (int i = 0; i < 100; i++) { new Thread(new StaticThread()).start(); } } }
public class StaticAction { public static int i = 0; public static void print() { int sum = 0; for (int i = 0; i < 10; i++) { System.out.print("step " + i + " is running."); sum += i; } if (sum != 45) { System.out.println("Thread error!"); System.exit(0); } System.out.println("sum is " + sum); } }
运行效果图如下:
我们可以看到各个线程对静态方法的访问是交叉执行的,但是这并不影响各个线程静态方法print()中sum值的计算。也就是说,在此过程中没有使用全局变量的静态方法在多线程中是安全的,静态方法是否引起线程安全问题主要看该静态方法是否对全局变量(静态变量static member)进行修改操作。
在多线程中使用同一个静态方法时,每个线程使用各自的实例字段(instance field)的副本,而共享一个静态字段(static field)。所以说,如果该静态方法不去操作一个静态成员,只在方法内部使用实例字段(instance field),不会引起安全性问题。
但是,如果该静态方法操作了一个静态变量,则需要静态方法中采用互斥访问的方式进行安全处理。我们来看一下没有使用互斥访问的话会产生怎样的问题:
public class StaticAction { public static int i = 0; public static void incValue() { int temp = StaticAction.i; try { Thread.sleep(1); } catch (Exception e) { e.printStackTrace(); } temp++; StaticAction.i = temp; } }
public class StaticThread implements Runnable { @Override public void run() { // TODO Auto-generated method stub StaticAction.incValue(); } public static void main(String[] args) { for (int i = 0; i < 100; i++) { new Thread(new StaticThread()).start(); } try { Thread.sleep(1000); //预留足够的时间让上面的线程跑完 } catch (Exception e) { e.printStackTrace(); } System.out.println(StaticAction.i); } }
运行结果如下:
在这里我们就可以看出问题了。为了实现互斥访问,这时我们需要加入一个synchronized关键字。代码修改如下:
public class StaticAction { public static int i = 0; public synchronized static void incValue() { int temp = StaticAction.i; try { Thread.sleep(1); } catch (Exception e) { e.printStackTrace(); } temp++; StaticAction.i = temp; } }
public class StaticThread implements Runnable { @Override public void run() { // TODO Auto-generated method stub StaticAction.incValue(); } public static void main(String[] args) { for (int i = 0; i < 100; i++) { new Thread(new StaticThread()).start(); } try { Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } System.out.println(StaticAction.i); } }
运行结果如下,这回不会出现什么问题了:
加入synchronized关键字的静态方法称为同步静态方法。
在访问同步静态方法时,会获取该类的“Class”对象,所以当一个线程进入同步的静态方法中时,线程监视器获取类本身的对象锁,其它线程不能进入这个类的任何静态同步方法。它不像实例方法,因为多个线程可以同时访问不同实例同步实例方法。这个其实就是操作系统中的用信号量实现进程的互斥与同步问题,如果涉及在同一个类中有多个静态方法中处理多线程共享数据的话,那就变成用信号量解决生产者-消费者问题。也就是说,静态方法是一份临界资源,对静态方法的访问属于进入临界区;对静态变量的修改是一份临界资源,对静态变量的修改属于进入临界区。
相关推荐
《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...
综上所述,"java多线程查询数据库"是一个涉及多线程技术、线程池管理、并发控制、分页查询等多个方面的复杂问题。通过理解和掌握这些知识点,我们可以有效地提高数据库操作的效率和系统的响应速度。
本文将深入探讨Java多线程的相关概念、线程类和接口的使用,以及线程的同步与互斥。 首先,我们需要理解进程与线程的基本概念。程序是一组静态指令的集合,而进程则是程序在执行过程中的一个实例,拥有独立的内存...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过`Thread`类和并发工具来实现,接下来我们将深入探讨这些关键知识点。 1. **...
在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应...文档“java多线程实例.docx”可能包含具体的示例代码和详细解释,建议参考学习,以加深对Java多线程的理解。
Java多线程设计模式是Java开发中的重要领域,它涉及到如何在并发环境下高效、安全地管理资源和控制程序执行流程。本资料集包含了清晰完整的PDF版书籍和源代码,为学习和理解Java多线程设计模式提供了丰富的素材。 ...
Java 中的静态变量、静态方法、静态块和静态类 Java 中的静态变量、静态方法、静态块和静态类是 Java 编程语言的四个重要概念,它们之间存在着紧密的关系。下面将对这四个概念进行详细的介绍。 一、静态变量...
Java多线程是Java编程中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过继承`Thread`类或者实现`Runnable`接口。这个压缩包文件"JAVA多...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过继承Thread类或者实现Runnable接口。本示例可能是一个Applet,Applet是Java小...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,从而提升系统效率。在多线程环境中,变量共享是一个常见的需求,但也是引发问题的关键点。本篇文章将深入探讨Java多线程下变量共享的问题以及解决...
《深入学习:Java多线程编程》是一本专注于Java并发技术的专业书籍,旨在帮助开发者深入理解和熟练运用Java中的多线程编程。Java多线程是Java编程中的核心部分,尤其在现代高性能应用和分布式系统中不可或缺。理解并...
Java多线程笔记 Java多线程笔记是 Java 编程语言中关于多线程编程的笔记,涵盖了线程基础知识、线程优先级、线程状态、守护线程、构造线程、线程中断等多方面的内容。 获取简单 main 程序中的线程 在 Java 中,...
Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,从而提升系统效率。在面试中,对Java多线程的理解和熟练运用往往成为衡量开发者技能水平的重要标准。以下是对Java多线程面试题59题集合中可能涉及的...
Java多线程设计模式是Java开发中的重要领域,它涉及到并发编程、系统性能优化以及程序的稳定性。在Java中,多线程允许程序同时执行多个任务,极大地提升了程序的执行效率。本资源提供了详细的Java多线程设计模式的...
Java多线程教程详解 Java多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个任务,提高程序效率和响应速度。理解并熟练运用Java的多线程机制是成为一个专业Java开发人员的关键技能。 一、线程的概念与...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的运行效率和资源利用率。本笔记全面涵盖了多线程的学习,包括基础理论和实践代码,旨在帮助开发者深入理解并掌握Java多线程技术。 一、...
多线程有两种实现方法,分别是继承 Thread 类与实现 Runnable 接口。 4. 同步的实现方法 同步的实现方面有两种,分别是 synchronized,wait 与 notify。 5. synchronized 和 java.util.concurrent.locks.Lock 的...
多线程Java程序安全行为模型的静态检查方法 本文提出了一种多线程Java程序安全行为模型的静态检查方法。该方法使用参数化扩展上下文无关文法来抽象表示安全相关行为模型,并提供了从多线程Java程序自动生成安全相关...
Java多线程编程与设计模式的结合,能够帮助开发者构建高性能、高可用性的并发应用。理解并熟练掌握这些知识点,是每个Java程序员进阶的必经之路。通过阅读"Java多线程编程实战指南 设计模式篇.pdf",你将获得更深入...
本文将深入探讨Java多线程的详细知识,包括线程的创建、同步与通信、线程状态以及相关API的使用。 1. **线程的创建** - **实现Runnable接口**:这是创建线程的常见方式,通过实现Runnable接口并重写run()方法,...