static与并发
在java中static用来修饰Class类中属性和方法。
被static修饰的成员属性和成员方法独立于该类的任何对象,它们在内存空间上会被放在描述Class的位置中,也就是说它们为此类(Class)所有的实例对象共用。
所以说只要这个类被加载,那么这些被static修饰的属性和方法都已经在JVM中存在了,因此,我们可以通过类名直接调用这些属性和方法。
那么我就想到了一个在多线程和并发的情况下,被static修饰的方法会不会出现不正确的数据处理呢?
下面写一段测试的代码
Porter.java
public class Porter {
public static void test(int num){
System.out.printf("time : %s , num : %d \n",System.currentTimeMillis(),num);
}
}
Runner.java
public class Runner implements Runnable{
private int num;
@Override
public void run() {
Porter.test(getNum());
}
public void setNum(int num){
this.num = num;
}
public int getNum(){
return this.num;
}
public static void main(String args[]){
Thread th[] = new Thread[100];
for (int i = 0; i < th.length; i++) {
Runner run =new Runner();
run.setNum(i);
th[i] = new Thread(run);
th[i].start();
}
}
}
在这个多线程程序中,run()方法一直都在调用Porter的一个static方法test()。实际程序输出如下:
time : 1423399741495 , num : 0
time : 1423399741521 , num : 40
time : 1423399741520 , num : 39
time : 1423399741520 , num : 38
time : 1423399741518 , num : 37
time : 1423399741518 , num : 36
time : 1423399741517 , num : 34
time : 1423399741517 , num : 35
time : 1423399741523 , num : 43
time : 1423399741516 , num : 32
time : 1423399741516 , num : 33
time : 1423399741516 , num : 30
time : 1423399741516 , num : 31
time : 1423399741515 , num : 29
time : 1423399741515 , num : 28
……
虽然省略了一部分,但是程序确实没有执行错误,通过系统的时间戳发现,中间有几个线程确实也是同时执行的。这样说来被static修饰的方法并不存在并发的问题,那么这是为什么呢?
其实这就是变量的问题了,每次静态方法每次调用的内部变量,都是局部变量,每次调用静态方法时都会为它重新分配内存空间,所以是安全的。
static与并发的更多相关文章
- 031.[转] 从类状态看Java多线程安全并发
从类状态看Java多线程安全并发 pphh发布于2018年9月16日 对于Java开发人员来说,i++的并发不安全是人所共知,但是它真的有那么不安全么? 在开发Java代码时,如何能够避免多线程并发出 ...
- Swift GCD
var queue: dispatch_queue_t = dispatch_get_main_queue()// 主线程 queue = dispatch_get_global_queue(DISP ...
- 1、控制器运行一个Process进程,等待不等待的问题
一.区别 public static async void Execute(string para, string ffmpegPath, string timestr, string Id, str ...
- 组件化框架设计之Java SPI机制(三)
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本篇文章将从深入理解java SPI机制来介绍组件化框架设计: ...
- java static静态方法的并发性
在做一个web项目的时候需要做一个通用类去处理一些问题,想到这个类很多地方都有用到,又不想每次都new一个,因此就定义了里面的方法是静态方法,然后又因为多个静态方法都用到了同一个对象,结果定义了一个类 ...
- 关于JAVA中的static方法、并发问题以及JAVA运行时内存模型
一.前言 最近在工作上用到了一个静态方法,跟同事交流的时候,被一个问题给问倒了,只怪基础不扎实... 问题大致是这样的,“在多线程环境下,静态方法中的局部变量会不会被其它线程给污染掉?”: 我当时的想 ...
- .NET并行计算和并发4-Thread-Relative Static Fields and Data Slots
Thread Local Storage: Thread-Relative Static Fields and Data Slots 文章摘自msdn library官方文档 可以使用托管线程本地存储 ...
- java 多线程:Thread 并发线程: 方法同步synchronized关键字,与static的结合
1.方法内的变量是安全的 方法内定义的变量,每个变量对应单独的内存变量地址,多个线程之间相互不影响.多个线程之间的变量根本没有一毛钱关系 public class ThreadFuncVarSafe ...
- .Net多线程编程—并发集合
并发集合 1 为什么使用并发集合? 原因主要有以下几点: System.Collections和System.Collections.Generic名称空间中所提供的经典列表.集合和数组都不是线程安全 ...
随机推荐
- Web.xml配置参数详解
1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字符编码.DOCYTPE声明必须立即出现在此头之后.这个声明告诉服务器适用的 ...
- js控制刷新后回到页面原来位置
1.document.location.reload(); 2.http://www.jb51.net/article/99749.htm
- ci框架登陆之后每隔几分钟就需要重新登录的问题
一个简单的登陆写好之后,发现每次进入需要登陆之后才能进入的页面都会跳转到登录页面,猜测应该是session被清了,打印出来,果然为空,但是我没有设置session的生存周期,按照默认的应该是24小时, ...
- Esri的开源JS项目杂谈
一提到Esri大家首先想到的是庞大的ArcGIS产品大家族,其产品包含从桌面端,到服务器/云端,再到web/移动端.作为一名极客,不聊开源逼格似乎上不去啊.其实,Esri作为一个开放的平台,不仅有稳定 ...
- OGNL的使用
访问Action中的普通属性: <s:property value="loginname"/><br/> 访问Action中的对象属性: <s:pro ...
- EF DbContext 并发执行时可能出现的问题
现在许多Web项目都使用了IOC的DI注入组件.其中对象的生命周期管理是非常重要的. 有时我们为了提高请求的响应,经常在请求线程中执行多个子线程,然而忽略了EF的DbContext的生命周期管理. D ...
- MVC高级编程+C#高级编程
本人今年的目标是学习MVC高级编程和C#高级编程,把自己的基础打的扎实,本文中值是一个开到,定期会在上面记录学习的技术点和心得就,加油吧!!!!!
- Bootstrap 简洁、直观、强悍的前端开发框架,让web开发更迅速、简单。
Bootstrap 简洁.直观.强悍的前端开发框架,让web开发更迅速.简单.
- fatal error
1. fatal error C1083: 无法打开源文件 编译报此错误: 1>c1xx : fatal error C1083: 无法打开源文件:“Projects\XXXCCCC\VB ...
- 关于telnet源码
Linux 下流行的 telnet 实现有两个:GNU 的 inetutils 中的实现哈佛的 netkit-telnet 1. http://ftp.gnu.org/gnu/inetutils/2. ...