萱草|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方法或者synchronized代码块 , 当出现异常时 , JVM会自动释放当前线程占用的锁 , 因此不会由于异常导致出现死锁现象 。
【萱草|synchronized关键字,老师发糖了,要排排队领取哦!Java】欢迎小伙伴们留言交流~