多线程下的函数调用次数统计,帮助理解synchronized和static关键字
2017-05-17 14:22
1226 查看
统计函数调用次数:
如上,多线程环境下,方法1、方法2的执行不会有问题;
但是方法3会有问题,即输出的结果具有不确定性;
如果main函数中的调用这样修改,则不会出现线程同步问题,原因:
synchronized为对象同步锁,多线程下,调用foo()函数时,锁住对象a,使得thread2和thread3无法获取当前对象a,因此无法访问函数foo(),即不会出现多线程的同步问题;
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(),即不会出现多线程的同步问题;
相关文章推荐
- zzuli OJ 1113: 递归调用的次数统计(函数专题)
- 多线程基础学习七:使用synchronized实现多线程情况下的访问次数统计
- zzuli OJ 1113: 递归调用的次数统计(函数专题)
- synchronized与static synchronized 的差别、synchronized在JVM底层的实现原理及Java多线程锁理解
- 黑马程序员 笔记(六)——面向对象(static关键字、静态、main函数、、帮助文档、对象的调用和初始化、单例)
- 1113: 递归调用的次数统计(函数专题)
- volatile、synchronized、static多线程运用(个人理解)
- java中synchronize关键字的理解 在多线程环境下的应用: synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。 1. syn
- synchronized与static synchronized 的区别、synchronized在JVM底层的实现原理及Java多线程锁理解 (r)
- synchronized与static synchronized 的区别、synchronized在JVM底层的实现原理及Java多线程锁理解
- IPHONE 开发 9 -- Object C static关键字,数组对象,词典,动态词典,集合对象,函数调用关系
- MFC界面包装类-多线程时成员函数调用的断言失败
- static 函数 不能为外部文件调用
- 多线程调用同一个函数
- Java线程同步机制synchronized关键字的理解
- Java线程同步机制synchronized关键字的理解
- 函数调用中的关键字学习
- java 多线程 Synchronized方法和方法块 synchronized(this)和synchronized(object)的理解
- 函数参数与函数调用(彻底理解值传递与引用传递)
- 跟我快乐学C++系列:(4)理解函数的调用