验证同步函数(静态与非静态)的锁是否是Object
来源:互联网 发布:魔兽副本数据库 编辑:程序博客网 时间:2024/04/30 15:17
一、首先验证非静态同步函数锁
两条线程分别运行两个方法,测试同步函数show()是否与run()函数一样,使用的都是Object作为锁。
class Ticket implements Runnable{ private int num = 200; Object obj = new Object(); boolean flag = true; @Override public void run() { if(flag){ while(true){ synchronized (obj) { if(num > 0){ try {Thread.sleep(10);} catch (Exception e) {} //模拟处理时间 System.out.println("run..."+Thread.currentThread().getName()+"...."+num--); } } } }else{ while(true) show(); } } public synchronized void show(){ if(num > 0){ try {Thread.sleep(10);} catch (Exception e) {}//模拟处理时间 System.out.println("show..."+Thread.currentThread().getName()+"..."+num--); } }}public class Test { public static void main(String[] args) { Ticket t = new Ticket(); Thread t1 = new Thread(t); Thread t2 = new Thread(t); t1.start(); try {Thread.sleep(10);} catch (Exception e) {} //减慢速度,不然因为电脑速度过快导致测试不出结果 t.flag = false; t2.start(); }}
测试结果
run...Thread-0....1show...Thread-1...1
打印的信息中,出现了重复的num,故同步函数的锁并非Object。
查资料知,非静态同步函数锁为this,将synchronized (obj)
改为synchronized (this)
即可验证。
二、验证静态同步函数锁
将public synchronized void show()改为public static synchronized void show()
将synchronized (obj)改为synchronized (this.getClass())或者synchronized (Ticket.class)
可知
通过验证发现 同步函数如果被静态修饰后,不再以this 为锁 静态进内存时,内存中没有本类对象,但是一定有该类的字节码文件对象 类名.class 该对象的类型是class 静态的同步方法,使用的锁是该方法所在类的字节码文件对象。类名.class
原因——静态变量优先于对象存在,
所谓的静态变量优先于对象存在,是说当你的类被加载到内存中时,被static修饰的变量也会随着类的加载而加载到内存中,而这个类的对象此时并没有出现,只有当你申明并实例化这个类的变量时,才会在内存中开辟空间存放该类的对象,所以当类加载后,可以直接调用类名.变量名直接调用,因为其在内存中已经存在,而对象暂时还没有。
0 0
- 验证同步函数(静态与非静态)的锁是否是Object
- 静态同步方法与非静态同步方法的区别
- synchronized 同步方法中静态与非静态的区别
- 线程静态同步与非静态差别
- JAVA 多线程静态同步函数的锁是class 对象
- java-静态同步函数的锁是Class对象
- java多线程-静态同步函数的锁是Class对象
- 多线程静态同步函数的锁是class 对象
- (多线程-静态同步函数的锁是Class对象)
- JAVA 多线程静态同步函数的锁是class 对象
- 静态成员函数与非静态成员函数的区别
- 同步静态方法与同步非静态方法
- java synchronized同步静态方法和同步非静态方法的区别与举例
- java synchronized同步静态方法和同步非静态方法的区别与举例
- 同步静态和非静态同步的区别
- 静态与非静态
- 静态与非静态
- 非静态函数,非静态变量与静态函数,静态变量
- 计算结构体的字节数
- 基于注解的对象关系映射的实现(一):使用示例
- Eclipse创建java web工程
- Thymeleaf设置任意属性
- HBase学习笔记——系统架构
- 验证同步函数(静态与非静态)的锁是否是Object
- 当出现no changes added to commit时如何正确使用git提交命令
- SQL SERVER 转换大小写
- Python sys模块的常用方法
- 1019. General Palindromic Number (20)
- PHP的性能杂谈
- NSOperation
- Java实现括号匹配校验
- JDBC操作数据库