- 浏览: 39601 次
文章分类
最新评论
1.静态方法
无论是静态方法还是实例方法,在内存中都只有一份代码,也就是只占用一份内存空间
方法属于一个程序块,只有当别人调用它时才会调到内存里面去执行,也就是说当前有多少个线程在执行就有多少组方法块里的局部变量
2.静态变量
只存在一份,多个线程公用一份,一个线程修改就会影响其他线程
3.结论
静态方法是使用得当是线程安全的,因为每次调用会创建一份私有块,如果是静态变量是的的话就要加锁挥着其他处理。
4.实例
无论是静态方法还是实例方法,在内存中都只有一份代码,也就是只占用一份内存空间
方法属于一个程序块,只有当别人调用它时才会调到内存里面去执行,也就是说当前有多少个线程在执行就有多少组方法块里的局部变量
2.静态变量
只存在一份,多个线程公用一份,一个线程修改就会影响其他线程
3.结论
静态方法是使用得当是线程安全的,因为每次调用会创建一份私有块,如果是静态变量是的的话就要加锁挥着其他处理。
4.实例
class User{ private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
public class StaticTest { private static int count = 0; private static int counts = 0; /** * 不会存在并发问题 * * @return */ public static String getTestStr() { String xx = Thread.currentThread().toString(); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } return xx; } /** * 存不存在并发问题与传入的变量有关 * 假如thread a和thread b都在操作对象a则存在 * @param user * @return */ public static String getTestUser(User user) { String str = "id: " + user.getId() + "name: " + user.getName(); try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } return str; } /** * 存在并发问题 * * @return */ public static int getTestCount() { count++; count++; count++; count++; count++; try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } count++; count++; count++; count++; count++; return count; } /** * 不存在并发问题 * * @return */ public synchronized static int getTestCountS() { counts++; counts++; counts++; counts++; counts++; try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } counts++; counts++; counts++; counts++; counts++; return counts; } public static void main(String[] args) { User user = new User(); for (int i = 0 ; i < 1000 ; i++){ final int finalI = i; Thread thread = new Thread(new Runnable() { @Override public void run() { User userTmp = new User(); user.setId(finalI); user.setName(Thread.currentThread().toString()); userTmp.setId(finalI); userTmp.setName(Thread.currentThread().toString()); //局部变量不存在问题 System.out.println("getTestStr: " + Thread.currentThread() + StaticTest.getTestStr()); //与user有关 System.out.println("getTestUser: " + Thread.currentThread() + StaticTest.getTestUser(user)); System.out.println("getTestUseS: " + Thread.currentThread() + StaticTest.getTestUser(userTmp)); //线程不安全 System.out.println("getTestCount: " + Thread.currentThread() + StaticTest.getTestCount() % 10); //安全但是慢需要加锁 System.out.println("getTestCountS: " + Thread.currentThread() + StaticTest.getTestCountS() % 10); } }); thread.start(); } } }
发表评论
-
JVM内存结构及分析
2017-07-16 19:38 563JVM内存模型 名称特征 ... -
JVM调优实例
2017-06-24 12:30 01.背景:由于最近上线新增业务模块,业务量要增加所以对上线服务 ... -
音视频编码转换-ffmpeg
2016-12-30 18:42 15781.前言 由于最近在做ios与android端需要做a ... -
git did not match any file(s) known to git
2016-04-23 23:49 31171.did not match any file(s) kno ... -
JavaThread-ThreadLocal笔记
2015-12-23 14:54 5311.ThreadLocal简介 早在JDK 1.2的版本中就提 ... -
JUC-CountDownLatch笔记
2015-12-23 10:53 5621.CountDownLatch简介 CountDownLat ... -
Lambda表达式实现设计模式:命令模式
2015-10-13 09:59 706如何在使用Java 8 Lambda表达式的函数式编程方式时实 ... -
mysql 错误汇总
2015-08-12 16:49 4351.Mysql ERROR 1045 (28000): Acc ... -
Java注解
2015-08-07 11:25 01.@Retention(RetentionPolicy.RU ... -
Base64 编解码 工具类
2015-07-28 22:48 42861.工具类: import java.io.Uns ... -
HttpClient(发送字符串,multipart, 参数等)
2015-07-10 11:12 2082备注:httpclient4.5 发送MultiPart/Pa ... -
转载-搜索引擎实时秒级更新
2015-07-08 14:02 859搜索是很多用户在天 ... -
tomcat-定时任务
2015-03-30 15:27 6571.监听类 import java.util.Timer ... -
JVM-工作原理
2015-03-16 23:26 644一、 JVM的生命周期 1. J ... -
tomcat-启动时启动额外线程并控制线程状态
2015-02-04 18:22 675通过启动线程可以进行后台的操作 1.创建servlet ... -
Exception in thread "main" SoapFault - faultcode: 'soapenv:Server.userException'
2015-01-20 22:32 14281.抛出此类错误大部分都是服务端发布webservice调用出 ... -
Tomcat映射虚拟目录
2015-01-19 22:43 01.设置虚拟目录 <Host>标签</H ... -
android-运行java main方法
2014-12-30 16:10 7191.右键入口类(含有Main方法的)Run Configura ... -
Mybatis 常见错误汇总
2014-12-28 22:31 01.插入数据到数据库是异常 ### Cause: java.s ... -
jsoup
2014-12-17 00:25 01. package com.wuhao.itinfo ...
相关推荐
Jupyter-Notebook
Jupyter-Notebook
高效甘特图模板下载-精心整理.zip
lstm Summary Framework: z = U>x, x u Uz Criteria for choosing U: • PCA: maximize projected variance • CCA: maximize projected correlation • FDA: maximize projected intraclass variance
OpenGL调试工具,适合图形开发者,包括视频开发,播放器开始以及游戏开发者。
全国行政区划shp最新图.zip
全国研究生招生与在校数据+国家线-最新.zip
Jupyter-Notebook
直播电商交流平台 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B
《林黛玉进贾府》课本剧剧本
2000-2020年沪深A股上市公司融资约束程度SA指数-最新数据发布.zip
PPT模版资料,PPT模版资料
CPA注会考试最新教材资料-最新发布.zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
内容概要:本文提供了一个完整的职工管理系统的C++源代码。通过面向对象的编程方法,实现了包括创建新职工、查询、增加、修改、删除、排序、统计以及存储和恢复职工数据在内的多个基本操作功能。该系统支持不同的用户角色(如管理员与老板),并通过菜单驱动方式让用户方便地进行相关操作。此外,还包括了错误检测机制,确保操作过程中的异常得到及时处理。 适合人群:有一定C++语言基础,特别是面向对象编程经验的程序员;企业管理人员和技术开发人员。 使用场景及目标:适用于中小型企业内部的人力资源管理部门或IT部门,用于维护员工基本信息数据库,提高工作效率。通过本项目的学习可以加深对链表、类和对象的理解。 阅读建议:建议先熟悉C++的基本语法和面向对象概念,再深入学习代码的具体实现细节。对于关键函数,比如exchange、creatilist等,应当重点关注并动手实践以加强理解。
Jupyter-Notebook
考研公共课历年真题集-最新发布.zip
Huawei-HKUST Joint Workshop on Theory for Future Wireless 15-16 September 2022 华为-香港科技大学未来无线理论联合研讨会 Speaker:Jingwen Tong
演出人员与观众疫情信息管理系统 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B
《林黛玉进贾府》课本剧剧本.pdf