JAVA中锁的问题
来源:互联网 发布:国内io域名注册 编辑:程序博客网 时间:2024/06/16 15:40
public class HelloSogou{ public static synchronized void main(String[] a){ Thread t=new Thread(){ public void run(){Sogou();} }; t.run(); System.out.print("Hello"); } static synchronized void Sogou(){ System.out.print("Sogou"); }}
运行结果:SogouHello
public synchronized void methodA(int a, int b){}
public synchronized void methodB(int a){
methodA(a, 0);
}
首先要明白两个问题,1.锁的对象是谁?2.谁持有了锁?
假设方法A和B是在同一个类Test中的两个方法。
Test t=new Test();
t.methodB();
调用methodB()方法,获得锁,锁是对象t;锁谁持有?当前线程(不可以说是methodB持有该锁),methodB又调用methodA,也需要锁t,该线程已持有t,当然可以直接调用methodA。
类比到此题,只有一个主线程,调用main,持有HelloSogou.class锁,那当然可以直接调用Sogou方法。
第二,如果是t.statrt(),那么这个题,静态同步函数的锁是该类的字节码文件.class。此题中,main函数和Sogou方法都是static的,所以持有相同锁 HelloSogou.class ,那么,在main线程(main 是一个线程也是一个进程 )中又开了一个线程,调用Sogou方法,锁会冲突。
我的分析是:调用main函数(一个线程),main函数开启另一个线程,并启动,但是main函数和Sogou方法是同一个锁,所以main函数执行完毕后才会释放锁,Sogou方法才会执行,这就是为什么,换成start,是HelloSogou。
第三,将Sogou方法的锁改为其他.class锁,那么,HelloSogou和SogouHello都可能出现。因为没有互斥现象了,变为抢占式的了。
- JAVA中锁的问题
- Java线程中锁的问题
- Java 中出现的问题?
- JAVA中数据类型的问题
- JAVA中乱码的问题
- java中指针的问题
- java中遇到的问题...
- java中遇到的问题
- java中字符集的问题
- java中"/"与"\"的问题
- java中死锁的问题
- java中字符集的问题
- Java中常见的问题
- java中运算的问题
- java中类的问题!
- java中字符集的问题
- java中引号的问题
- Java中Map的问题
- 大数据
- FragmentTabHost简单实用
- Canvas实现绚丽的倒计时效果(动画效果)
- jvm参数实例分析
- Javascript 清空数组的三种方式
- JAVA中锁的问题
- 让你的代码减少三倍!使用kotlin开发Android(五) 监听器
- FrameLayout绘制 源码详解
- 记录1
- OpenCV对图像局部进行滤波
- Git/Github工作流 (workflow)
- misc分区
- MySQL5.7找到data文件夹
- python字符串操作,截取,拼接,替换,删除,比较,查找