网站开发技术方案编写vue适合什么样的网站开发
网站开发技术方案编写,vue适合什么样的网站开发,响应式自适应织梦网站模板,wordpress flash 插件当问到多线程时候如何解决线程安全的问题时候#xff0c;大部分人都知道加锁。提到锁最先接触到的就是Synchronized关键字。
当我们想要保证一个共享资源在同一时间只会被一个线程访问到时#xff0c;我们可以在代码中使用synchronized关键字对类或者对象加锁
synchronized…当问到多线程时候如何解决线程安全的问题时候大部分人都知道加锁。提到锁最先接触到的就是Synchronized关键字。
当我们想要保证一个共享资源在同一时间只会被一个线程访问到时我们可以在代码中使用synchronized关键字对类或者对象加锁
synchronized常用的有以下三种使用方式
▪修饰代码块即同步语句块其作用的范围是大括号{}括起来的代码作用的对象是调用这个代码块的对象。
▪ 修饰普通方法即同步方法其作用的范围是整个方法作用的对象是调用这个方法的对象。
▪ 修饰静态方法其作用的范围是整个静态方法作用的对象是这个类的所有对象。
/*** 对象锁*/public class Test{// 对象锁形式1(方法锁)public synchronized void method1(){System.out.println(对象锁也是方法锁);try{Thread.sleep(500);} catch (InterruptedException e){e.printStackTrace();}}// 对象锁形式2代码块形式public void method2(){synchronized (this){System.out.println(对象锁2);try{Thread.sleep(500);} catch (InterruptedException e){e.printStackTrace();}}}/*** 方法锁即对象锁中的形式1*/public synchronized void method1(){System.out.println(对象锁也是方法锁);try{Thread.sleep(500);} catch (InterruptedException e){e.printStackTrace();}}/*** 类锁*/
public class Test{// 类锁形式1 锁静态方法public static synchronized void method1(){System.out.println(类锁1);try{Thread.sleep(500);} catch (InterruptedException e){e.printStackTrace();}}// 类锁形式2 锁静态代码块public void method2(){synchronized (Test.class){System.out.println(类锁2);try{Thread.sleep(500);} catch (InterruptedException e){e.printStackTrace();}}}使用javap -c Test可以查看编译之后的具体信息
/修饰方法
public synchronized void method1();descriptor: ()Vflags: ACC_PUBLIC, ACC_SYNCHRONIZEDCode:stack2, locals1, args_size10: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;3: ldc #3 // String 对象锁也是方法锁5: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V8: return
//类锁public void method2();descriptor: ()Vflags: ACC_PUBLICCode:stack2, locals3, args_size10: ldc #5 // class com/demo/Test2: dup3: astore_14: monitorenter5: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;8: ldc #3 // String 类锁210: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V13: aload_114: monitorexit15: goto 2318: astore_219: aload_120: monitorexit21: aload_222: athrow23: return
可以看到在同步块的入口和出口分别有monitorenter和monitorexit指令。当执行monitorenter指令时线程试图获取锁也就是获取monitormonitor对象存在于每个Java对象的对象头中synchronized锁便是通过这种方式获取锁的也是为什么Java中任意对象可以作为锁的原因的持有权。当计数器为0则可以成功获取获取后将锁计数器设为1也就是加1。相应的在执行monitorexit指令后将锁计数器设为0表明锁被释放。如果获取对象锁失败那当前线程就要阻塞等待直到锁被另外一个线程释放为止。
在synchronized修饰方法时是添加ACC_SYNCHRONIZED标识该标识指明了该方法是一个同步方法JVM通过该ACC_SYNCHRONIZED访问标志来辨别一个方法是否声明为同步方法从而执行相应的同步调用。
要想真正了解Monitor怎么实现加锁和解锁的需要先了解对象头。让我们看看对象模型。
HotSpot虚拟机中设计了一个OOP-Klass Model。OOPOrdinary Object Pointer指的是普通对象指针而Klass用来描述对象实例的具体类型。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/87085.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!