毕向东讲解(摘)—8.静态同步函数
来源:互联网 发布:淘宝上苹果促销代码 编辑:程序博客网 时间:2024/06/05 00:37
如果同步函数被静态修饰之后,使用的锁是什么呢?
通过验证,发现不在是this。因为静态方法中也不可以定义this。
静态进内存是,内存中本来没有对象,但是一定有该类对应的字节码对象。(类名.class)该对象的类型是class
得出结论:
静态的同步方法,使用的锁是该方法所在类的字节码文件对象。
package day6;
/**
* 静态同步函数
*
* 这里同步函数被静态修饰之后,有一定几率会出现线程不安全的错误
* 说明这时静态同步函数的锁已经不是当前对象了,那么我们应该怎么办?
* (静态函数中不能定义this)
*
* 静态进内存是,内存中本来没有对象,但是一定有该类对应的字节码对象。
* (类名.class)该对象的类型是class
得出结论:
静态的同步方法,使用的锁是该方法所在类的字节码文件对象。
* @authormzy
*
*/
publicclassTest2{
publicstaticvoidmain(String[]args){
Ticket1tk=newTicket1();
Threadt1=newThread(tk);
Threadt2=newThread(tk);
t1.start();
try{
Thread.sleep(10);//让主线程sleep 10ms
//这里必须抛出异常
}catch(Exceptione){
}
t2.start();
}
}
classTicket1implements Runnable{
privatestaticintticket=100;
booleanflag=true;
publicvoidrun(){
if(flag){
while(true){
synchronized(Ticket1.class){//将当期对象作为synchronized的锁
if(ticket>0){
System.out.println("同步代码块"+Thread.currentThread().getName()+"卖出第"+ticket+"张票");
ticket--;
}
}
}
}else{
while(true){
show();
}
}
}
privatestaticsynchronizedvoidshow(){
if(ticket>0){
System.out.println("同步函数"+Thread.currentThread().getName()+"卖出第"+ticket+"张票");
ticket--;
}
}
}
- 毕向东讲解(摘)—8.静态同步函数
- 毕向东讲解(摘)—6.多线程安全问题(同步函数)
- 毕向东讲解(摘)—7.多线程安全问题(同步函数的锁this验证)
- 毕向东讲解(摘)—5.多线程的安全问题(同步代码块)
- 毕向东讲解(摘)—10.多线程(死锁)
- 毕向东讲解(摘)—1.多线程概述
- 毕向东讲解(摘)—线程售票重复bug
- 多线程三,同步函数、静态同步函数和单例设计模式中懒汉式即延迟加载模式的多线程问题(毕向东老师)
- 毕向东讲解(摘)—11.多线程线程间通信(示例代码)
- 毕向东讲解(摘)—9.单例设计模式的回顾
- 毕向东JAVA视频讲解笔记(前三课)
- 毕向东JAVA视频讲解(四五课)
- 毕向东JAVA视频讲解(第六课)
- 毕向东JAVA视频讲解(第七课)
- 毕向东JAVA视频视频讲解(第八课)
- 静态的应用——工具类(毕向东老师)
- 黑马程序员--毕向东老师--API讲解
- 毕向东老师--API讲解分享2
- 某天晚上要处理的800 张表的一个demo python小程序
- Response
- bzoj 2159: Crash 的文明世界
- Zookeeper自定义日志目录
- ThinkPHP小结2
- 毕向东讲解(摘)—8.静态同步函数
- Lesson 3 上机练习题——继承
- 超级强大的vim配置(vimplus)
- NSArray/NSMutableArray创建,获取,遍历,排序
- 爬取百度贴吧楼层信息实战代码
- centos7安装elasticsearch
- php 根据省市区来划分区域权限
- shiro认证源码
- Session踢人管理