多线程--同步函数使用的锁是this
来源:互联网 发布:js html font size 编辑:程序博客网 时间:2024/06/10 20:56
同步函数用的是哪一个锁呢?
函数需要被对象调用。那么函数都有一个所属对象引用。就是this。
所以同步函数使用的锁是this。
通过程序进行验证
通过验证,发现不在是this。因为静态方法中也不可以定义this。
静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象。
类名.class 该对象的类型是Class
函数需要被对象调用。那么函数都有一个所属对象引用。就是this。
所以同步函数使用的锁是this。
通过程序进行验证
需求:使用两个线程来买票。一个线程在同步代码块中。一个线程在同步函数中。都在执行买票动作。
package com.tan;class Ticket implements Runnable{private int tick = 100;//Object obj = new Object();boolean flag = true;public void run(){if(flag){while(true){synchronized(this) //两个锁的对象要一样,这样能保证安全,否则会出现Thread-0....code : 0{if(tick>0){try{Thread.sleep(10);}catch(Exception e){}System.out.println(Thread.currentThread().getName()+"....code : "+ tick--);}}}}elsewhile(true)show();}public synchronized void show()//this{if(tick>0){try{Thread.sleep(10);}catch(Exception e){}System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick--);}}}class ThisLockDemo{public static void main(String[] args) {Ticket t = new Ticket();Thread t1 = new Thread(t);Thread t2 = new Thread(t);t1.start();//让主线程停10毫秒 ,这个时候能运行的只有t1线程try{Thread.sleep(10);}catch(Exception e){}t.flag = false;t2.start();}}
如果同步函数被静态修饰后,使用的锁是什么呢?
通过验证,发现不在是this。因为静态方法中也不可以定义this。
静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象。
类名.class 该对象的类型是Class
静态的同步方法,使用的锁是该方法所在类的字节码文件对象。 类名.class
class Ticket implements Runnable{private static int tick = 100;//Object obj = new Object();boolean flag = true;public void run(){if(flag){while(true){synchronized(Ticket.class){if(tick>0){try{Thread.sleep(10);}catch(Exception e){}System.out.println(Thread.currentThread().getName()+"....code : "+ tick--);}}}}elsewhile(true)show();}public static synchronized void show(){if(tick>0){try{Thread.sleep(10);}catch(Exception e){}System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick--);}}}class StaticMethodDemo{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();}}
0 0
- 多线程--同步函数使用的锁是this
- 多线程之同步函数使用的是this锁
- 多线程(多线程-同步函数的锁是this)
- java多线程-同步函数的锁是this
- 验证多线程中同步函数锁是this对象
- java-同步函数的锁是this
- java多线程详解四 验证同步函数的锁是this
- JAVA之旅(十三)——线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this
- 线程--同步函数锁是this
- JAVA 多线程静态同步函数的锁是class 对象
- java多线程-静态同步函数的锁是Class对象
- 多线程静态同步函数的锁是class 对象
- (多线程-静态同步函数的锁是Class对象)
- JAVA 多线程静态同步函数的锁是class 对象
- 毕向东讲解(摘)—7.多线程安全问题(同步函数的锁this验证)
- 多线程同步 -- WaitForMultipleObjects()函数的使用详解
- (49)静态同步函数的锁是Class对象,例子:懒汉式--在多线程中存在问题--同步解决
- java多线程-同步函数的锁
- heatmap.js 一个用canvas画热力图的利器
- linux下vi命令大全
- 函数导出方式不对,导致的“error link2019 无法解析的外部符号 ”
- 一致性hash算法
- Outlook 的键盘快捷方式
- 多线程--同步函数使用的锁是this
- poj 2255 Tree Recovery(求后序遍历,二叉树)
- 完美打印二叉树
- 输入a1,a2,...,an,b1,b2,...,bn, 将这个序列顺序改为a1,b1,a2,b2,a3,b3,...,an,bn
- relocation R_X86_64_32S against -fPIC
- 不弹出提示框直接导出excel
- spring技术内幕11-JdbcTemplate封装Jdbc
- 编写高质量的Objective-C代码
- Go-XPath解析