博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java基础线程之run()和start()
阅读量:3906 次
发布时间:2019-05-23

本文共 1169 字,大约阅读时间需要 3 分钟。

牛客网java基础系列

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"); }}

解析如下:

我觉得误区有两个:一个是run和start区别,Thread.run()是调用方法,Thread. start()是启动线程;另一个是锁持有问题。这个题是调用方法,和多线程就无关。本题只有一个线程,持有HelloSogou.class锁。那么,就是另一个问题:同步方法调用另一个同步方法的锁问题?

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都可能出现。因为没有互斥现象了,变为抢占式的了。

转载地址:http://wrlen.baihongyu.com/

你可能感兴趣的文章
大数据分析与应用技术创新平台
查看>>
安全态势感知
查看>>
菜鸟下一代分布式体系架构的设计理念
查看>>
漫谈 · 比知行合一更重要的是意行合一
查看>>
漫谈 · 软件设计中的具象化
查看>>
漫谈 · 软件中的不确定
查看>>
癃闭病以及其常见药方
查看>>
人生就是不断学习和修行-2018年个人总结
查看>>
开源代码学习技巧-Nats源码原理分析
查看>>
开源代码学习-nsq(v0.1.1版本)源码分析
查看>>
开源代码学习-nsq(v0.1.5版本)源码分析
查看>>
开源代码protoactor-go[e866f39]源码分析
查看>>
开源代码protoactor-go源码分析-async schedule
查看>>
开源代码TarsGo-v1.0.0源码分析之transport
查看>>
开源代码memberlist源码分析
查看>>
本人公众号技术文章目录-持续更新
查看>>
qt.network.ssl: QSslSocket: cannot call unresolved function
查看>>
Qt 记录
查看>>
Mac Qt 应用图标
查看>>
QT 实现Dock应用程序点击 ---Mac OS X
查看>>