多线程下的函数调用次数统计,帮助理解synchronized和static关键字
来源:互联网 发布:网络危机公关 编辑:程序博客网 时间:2024/05/17 09:08
统计函数调用次数:
import java.lang.Thread;public class CalculateCallTime implements Runnable { private static int times = 0; private static Object mem = new Object(); /** * 方法1: */ public static synchronized void foo() { times++; System.out.println(times); } /** * 方法2: */ public void foo() { synchronized(mem) { times++; System.out.println(times); } } /** * 方法3: * 输出结果为 begin begin begin 4 4 4 * 说明 static 修饰的函数可被多个对象同时访问 */ public synchronized void foo() { times++; System.out.println("begin"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(times); } public static void main(String args[]) { Thread thread1 = new Thread(new CalculateCallTime()); Thread thread2 = new Thread(new CalculateCallTime()); Thread thread3 = new Thread(new CalculateCallTime()); thread1.start(); thread2.start(); thread3.start(); } @Override public void run() { this.foo(); }}
如上,多线程环境下,方法1、方法2的执行不会有问题;
但是方法3会有问题,即输出的结果具有不确定性;
public static void main(String args[]) { CalculateCallTime a = new CalculateCallTime(); Thread thread1 = new Thread(a); Thread thread2 = new Thread(a); Thread thread3 = new Thread(a); thread1.start(); thread2.start(); thread3.start(); }
如果main函数中的调用这样修改,则不会出现线程同步问题,原因:
synchronized为对象同步锁,多线程下,调用foo()函数时,锁住对象a,使得thread2和thread3无法获取当前对象a,因此无法访问函数foo(),即不会出现多线程的同步问题;
阅读全文
0 0
- 多线程下的函数调用次数统计,帮助理解synchronized和static关键字
- 多线程基础学习七:使用synchronized实现多线程情况下的访问次数统计
- Java多线程中Synchronized简介和Static Synchronized的区别
- Java多线程中Synchronized简介和Static Synchronized的区别
- 多线程synchronized和synchronized static方法的区别
- 黑马程序员 笔记(六)——面向对象(static关键字、静态、main函数、、帮助文档、对象的调用和初始化、单例)
- Synchronized 关键字的理解
- synchronized关键字的理解
- synchronized 关键字的理解
- Java Synchronized 和 Static 关键字的总结与使用
- Java关键字static和final的理解
- static关键字的理解
- static关键字的理解
- synchronized与static synchronized 的区别、synchronized在JVM底层的实现原理及Java多线程锁理解
- synchronized与static synchronized 的区别、synchronized在JVM底层的实现原理及Java多线程锁理解 (r)
- 1113: 递归调用的次数统计(函数专题)
- 对synchronized关键字的理解
- 关于“const ”关键字和“static”关键字用法的一些理解
- 101. Symmetric Tree
- 图片添加文字水印功能
- Objective-C block作用
- C语言的面向对象设计之 X264,FFMPEG 架构探讨
- cmd输出日期及格式
- 多线程下的函数调用次数统计,帮助理解synchronized和static关键字
- c#中接口和基类的问题
- 如何选择机器学习中的分类器
- 爱测未来安全-从真实的项目修复来看如何完全驾驭短文件名漏洞
- 微信基础开发
- 判断mysql 主从复制是否成功脚本
- hihoCoder 1015 KMP算法
- 909422229_什么是Rest风格?
- 由mysql函数UTC_DATE(),UTC_TIME()引出UTC