萱草|synchronized关键字,老师发糖了,要排排队领取哦!Java( 三 )
看下面这段代码就明白了:
publicclassTest{publicstaticvoidmain(String[]args){finalInsertDatainsertData=https://pcff.toutiao.jxnews.com.cn/p/20200810/newInsertData();newThread(){@Overridepublicvoidrun(){insertData.insert(Thread.currentThread());}}.start();newThread(){@Overridepublicvoidrun(){insertData.insert1(Thread.currentThread());}}.start();}}classInsertData{publicsynchronizedvoidinsert(Threadt){System.out.println("线程"+t.getName()+"执行insert开始");try{Thread.sleep(5000);}catch(InterruptedExceptione){e.printStackTrace();}System.out.println("线程"+t.getName()+"执行insert结束");}publicsynchronizedstaticvoidinsert1(Threadt){System.out.println("线程"+t.getName()+"执行insert1开始");System.out.println("线程"+t.getName()+"执行insert1结束");}}输出结果可以看出:第一个线程里面执行的是insert方法 , 不会导致第二个线程执行insert1方法发生阻塞现象 。 两个线程用的不是同一把锁 , 所以不会出现同步阻塞现象 。
线程Thread-0执行insert开始线程Thread-1执行insert1开始线程Thread-1执行insert1结束线程Thread-0执行insert结束下面我们看一下synchronized关键字到底做了什么事情 , 我们来反编译它的字节码看一下 , 下面这段代码反编译后的字节码为:
packagecom.testsyn;publicclassInsertData{privateObjectobject=newObject();publicvoidinsert1(Threadthread){//属性对象锁synchronized(object){}}publicvoidinsert2(Threadthread){//当前对象锁synchronized(this){}}publicvoidinsert3(Threadthread){//类锁synchronized(InsertData.class){}}//static方法锁publicstaticsynchronizedvoidinsert4(Threadthread){}//非static方法锁publicsynchronizedvoidinsert5(Threadthread){}//没有锁publicvoidinsert6(Threadthread){}}对生成的字节码文件执行命令javap-vInsertData.class , 结果如下:
【萱草|synchronized关键字,老师发糖了,要排排队领取哦!Java】欢迎小伙伴们留言交流~
- 萱草|手机的全面屏时代真的来了吗?
- 萱草|涉嫌传销,社交电商进入优胜劣汰后半场,千团倒闭
- 萱草|新能源汽车迎换电风口
- 萱草|Mate30Pro开启“退场价”,网友:盼到了,华为全力反击
- 萱草|华为无奈做出决定,手机行业或将“变天”?,高通放出“信号”
- 萱草|安全出海!华为云四大安全服务上线拉美
- 萱草|SQL 单表优化,SQL高级:代码实战
- 萱草|12售价曝光,跟国产旗舰差不多,香爆了?,iPhone
- 萱草|扬言中国不再是世界工厂,中国制造成了过去式,富士康拆分供应链
- 萱草|如何应对高刷屏这种耗电大户?LTPO+自适应频率显示显身手