验证同步代码块与同步函数的锁【多线程】
来源:互联网 发布:gradle linux 安装 编辑:程序博客网 时间:2024/05/20 19:30
通过一个卖票问题,验证多线程中同步代码块与同步函数的锁。
卖票系统,两台机器t1线程和t2线程,共同卖掉100张票。
package day13;public class SynFunctionLockDemo {public static void main (String[] args){Ticket t =new Ticket();//一个对象,共享100张票System.out.println("t :"+t);Thread t1 = new Thread(t);Thread t2 = new Thread(t);t1.start();try{Thread.sleep(10);}catch(InterruptedException e){}t.flag = false;t2.start();/*解释第九行 这一步,*在主进程main中,t1.start和t2.start以及t.flag=false同时运行到了*主线程进行了flag->false的过程*t1和t2线程都只能在flag=false的同步函数中进行*/}}class Ticket implements Runnable{private int num = 100;boolean flag =true;Object obj = new Object();public void run(){System.out.println("this:"+this);if(flag){//同步代码块for(int i=200;i>1;i--){synchronized(obj){if(num>0){try{Thread.sleep(10);}catch(InterruptedException e){}System.out.println(Thread.currentThread().getName()+"...obj..."+num--);}}}}else{for(int i=200;i>1;i--)show();}}public synchronized void show(){//同步函数if(num>0){try{Thread.sleep(10);}catch(InterruptedException e){}System.out.println(Thread.currentThread().getName()+"...function.."+num--);}}}
运行之后,结果会出现第0号票的可能,出现错误,说明同步函数和同步代码块的锁是不相同的。
如果将28行的synchronized(obj)改成synchronized(this)
结果不会出现第0号票,正确,这种改法保证了同步代码块和同步函数锁的一致性,同时也验证同步代码块与同步函数的锁是不一样的。
同步函数的使用的锁是this:
同步函数和同步代码块的区别:
同步函数的锁是固定的this。
同步代码块的锁是任意的对象。
建议使用同步代码块。
0 0
- 验证同步代码块与同步函数的锁【多线程】
- 验证同步代码块与同步函数的锁【多线程】
- java多线程-同步函数与同步代码块的区别
- 代码块与函数的同步
- JAVA——多线程编程之同步:同步代码块与同步函数(二)
- 从头认识多线程-2.18 同步方法与同步静态代码块持有的是不同的锁
- 多线程 同步代码块
- 多线程、同步代码块
- 多线程-同步代码块
- JAVA多线程 <二>同步函数和同步代码块
- 【java0009】多线程同步代码块和同步函数
- Java多线程线程、同步代码块、同步函数、死锁
- 多线程 Thread类,同步代码块,同步函数
- 多线程:初识同步代码块和同步函数
- 同步代码块,同步函数,静态同步函数的锁对象
- 15-多线程(同步代码块) 16-多线程(同步的好处和弊端)图解 16-多线程(同步的好处和弊端) 18-多线程(同步函数)
- Java多线程-线程的同步(同步代码块)
- Java多线程-线程的同步(同步代码块)
- 什么是MongoDB原子操作
- jquery基础知识
- ubuntu安装配置JDK
- 常用 git 命令使用说明(-help)汇总
- 【matlab】对每一行数据不等的txt文件读取问题
- 验证同步代码块与同步函数的锁【多线程】
- 【BS学习】——asp.net自定义控件
- js事件模型
- 栈的应用——四则运算表达式
- android tv焦点特效实现浅析
- Makefile工程管理
- W7 pydev 安装到ecplise上
- 创建多模块maven工程
- Lazy Spelling Bee