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

java并发体验。。。

    博客分类:
  • java
阅读更多

一直以来都在说多线程,说并发,发现有的时候并发在我眼前,我自己都不知道。。。
由于在spring中发布的服务service一般都是单例模式的,因此在多个请求过程中,调用的都是一个service,这个时候就是并发的问题了。如果在这个service里我们设定了一个全局变量 ,就会出现问题了。
测试代码如下:
使用一个测试DO:

public class TestDO {
 
 private String a;
 
 private String b;
 
 private int id;

 public String getA() {
 return a;
 }

 public void setA(String a) {
 this.a = a;
 }

 public String getB() {
 return b;
 }

 public void setB(String b) {
 this.b = b;
 }

 public int getId() {
 return id;
 }

 public void setId(int id) {
 this.id = id;
 }

}
 

 

 

测试的service,单例的。

public class ServiceA {
 //全局的变量DO,下面的方法会对这个进行操作!
 private TestDO testDO = new TestDO();

 private static ServiceA a = new ServiceA();

 private ServiceA() {
 
 }
 public static ServiceA  getA()
 {
 return a;
 }
 

 public void test(int i) {
 //TestDO testDO = new TestDO();
 try {
 Thread.sleep(1000);
 } catch (InterruptedException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 testDO.setId(i);
 testDO.setA("a" + i);
 testDO.setB("b" + i);

 System.out.println(testDO.getId()+"--"+testDO.getA()+"--"+testDO.getB());
 }

}
 

 

模拟的多线程操作的线程类:

public class ThreadA implements Runnable {
 //调用单例的service,这样所有的线程都用这个service
 private ServiceA a = ServiceA.getA();

 public ThreadA(int i) {
 this.i = i;
 }

 private int i;

 public void run() {
 a.test(i);
 }

}
 

 

测试类:

public class Main {

 /**
  * @param args
  */
public static void main(String[] args) {
Thread a[] = new Thread[10];
for (int i = 0; i < a.length; i++) {
a[i] = new Thread(new ThreadA(i));
}

for (int i = 0; i < a.length; i++) {
a[i].start();
}
}

}
 

 

 

输出为:

 

1--a2--b2
2--a2--b2
4--a4--b4
4--a4--b4
4--a4--b4
1--a4--b4
9--a9--b9
6--a6--b6
8--a8--b8
7--a7--b7
可以看到这里已经出现问题了。我们的预期是将0-9的每一样都打印出来。
相反的,我们将ServiceA中的全局DO改为下面的test方法中的
TestDO testDO = new TestDO();
再运行结果为:
6--a6--b6
9--a9--b9
8--a8--b8
1--a1--b1
7--a7--b7
2--a2--b2
0--a0--b0
4--a4--b4
3--a3--b3
5--a5--b5
可以看到这次的结果是想要的。。。


1
0
分享到:
评论

相关推荐

    (PDF带目录)《Java 并发编程实战》,java并发实战,并发

    《Java 并发编程实战》是一本专注于Java并发编程的权威指南,对于任何希望深入了解Java多线程和并发控制机制的开发者来说,都是不可或缺的参考资料。这本书深入浅出地介绍了如何在Java环境中有效地管理和控制并发...

    java并发实战编程 英文版

    《Java并发实战编程》是一本深入探讨Java多线程编程技术的专业书籍,旨在帮助开发者理解和掌握并发编程的核心概念和最佳实践。并发编程是现代软件开发中的关键领域,尤其是在多核处理器普及的今天,利用线程并行执行...

    JAVA并发编程实践.pdf

    根据提供的信息,“JAVA并发编程实践.pdf...掌握Java并发编程的基本原理和技术对于提升系统性能、减少延迟和提高用户体验有着重要意义。希望通过对以上知识点的学习,能够帮助开发者更好地理解和运用Java并发编程技术。

    Java并发编程面试题

    Java并发编程面试题 Java并发编程是指在Java程序中同时执行多个线程以提高程序的执行效率和响应速度的技术。并发编程可以带来许多优点,如提高程序的执行效率、改善用户体验等。但同时,Java并发编程也存在一些缺点...

    Java并发编程的艺术

    Java并发编程是现代软件开发不可或缺的一部分,它不仅可以提升程序的执行效率,还能改善用户体验。通过深入学习Java并发编程的相关知识和技术,开发者可以更好地利用多核处理器的优势,构建出高性能、健壮的应用程序...

    Java并发编程面试题目

    " Java并发编程面试题目" Java并发编程是Java编程语言中的一种核心技术,旨在提高程序的执行效率和响应速度。并发编程的优点是可以提高程序的执行效率,提高用户体验和系统性能。但是, 并发编程也存在一些缺点,...

    java高并发处理方法

    ### Java高并发处理方法 #### 一、HTML静态化 HTML静态化是一种高效的网页加载方式,它可以显著提高网站性能并减少服务器负担。对于那些需要频繁更新的网站而言,完全依赖手动实现静态化并不现实,因此引入了内容...

    java抽奖系统后台 springboot+mybatis redis队列处理高并发.zip

    在本项目中,"java抽奖系统后台 springboot+mybatis redis队列处理高并发.zip",我们可以探索几个关键的IT技术及其在构建高效抽奖系统中的应用。以下是对这些技术的详细说明: 1. **SpringBoot**: SpringBoot是...

    Java7并发编程实战手册-高清版

    这本书介绍了Java并发API的方方面面,提供了使用这一新功能的必备技巧,及介绍了Java并发API的所有功能,也特别强调了在Java7版本中的新功能。本书包含60多个实用的案例和技巧,可以帮助读者快速开始实践和体验并发...

    Java高并发秒杀API

    Java高并发秒杀API是一个典型的企业级应用场景,主要用于处理大量用户在同一时间抢购限量商品的情况。在设计这样的系统时,我们需要关注多个关键知识点,包括但不限于数据库操作、并发控制、性能优化以及分布式协调...

    Java 7并发编程实战手册 pdf全本

    本书介绍了Java并发API的方方面面,提供了使用这一新功能的必备技巧,及介绍了Java并发API的所有功能,也特别强调了在Java7版本中的新功能。本书包含60多个实用的案例和技巧,可以帮助读者快速开始实践和体验并发...

    笔记_Java并发编程(2).docx

    Java并发编程是Java开发中的重要组成部分,涉及到多线程、锁机制以及Java并发工具集(JUC)。在Java中,线程是程序执行的基本单元,它比进程更轻量级,能有效利用多核CPU资源,提高程序的执行效率。 进程是操作系统...

    java高并发解决方案

    【Java高并发解决方案】 在构建大型网站,尤其是门户网站时,面临的主要挑战之一是处理大量用户访问和高并发请求。为了应对这一挑战,通常会采取一系列技术措施,包括使用高性能服务器、数据库、编程语言以及Web...

    Java_多线程与并发编程总结.doc

    Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以...通过理解线程的工作原理和使用适当的并发工具,开发者能够充分利用现代多核处理器的计算能力,优化程序性能,提高用户体验。

    使用Java实现高并发推送服务.pdf

    本文档探讨了使用Java实现高并发推送服务的技术和方法,重点分析了如何通过Java NIO(New I/O)技术、消息队列技术、缓存技术等多种手段提升推送服务的处理能力和性能。 首先,高并发推送服务的主要目的是为了向...

    Java并发任务执行.pdf

    在上述的"Java并发任务执行.pdf"文档中,通过一个简单的单线程Web服务器示例来阐述了并发任务执行的重要性。 在Java中,任务通常表现为实现了`Runnable`接口的对象,它代表了一段可以被独立执行的代码逻辑。在提供...

    Java并发的基础知识.docx

    Java并发编程是软件开发中的重要领域,特别是在多核CPU的时代,有效地利用并发能极大地提高程序的性能和响应速度。本文将深入探讨Java并发基础知识,包括并发的目的、并发编程的缺点、减少上下文切换的策略、并行与...

    java并发编程与高并发解决方案笔记

    以上技术方案可以根据不同的并发场景和需求进行选择和组合,以确保Java并发编程中的接口幂等性,从而增强系统的可靠性和用户体验。在设计和实现高并发解决方案时,理解并合理运用这些技术是至关重要的。

Global site tag (gtag.js) - Google Analytics