乐器产品主要在什么网站做推广,上海网站制作 公司,wordpress 百度主题,南通网站建设系统方案作用和用法在多线程对共享资源进行并发访问方面#xff0c;JDK提供了synchronized关键字来进行线程同步#xff0c;实现多线程并发访问的线程安全。synchronized的作用主要体现在三个方面#xff1a;(1)确保线程互斥地访问同步代码#xff1b;(2)保证共享变量的线程可见性JDK提供了synchronized关键字来进行线程同步实现多线程并发访问的线程安全。synchronized的作用主要体现在三个方面(1)确保线程互斥地访问同步代码(2)保证共享变量的线程可见性(3)禁止指令重排。其中(2)和(3)相当于volatile关键字的作用。synchronized可以用在代码的以下地方(1)静态方法将类对象自身作为monitor对象对该类所有使用了sychronized修饰的静态方法进行同步即任何时候只能存在一个线程在调用该类的使用了synchronized修饰的静态方法其他调用了该类的使用了synchronized修饰的静态方法的线程需要阻塞(2)普通成员方法使用类的对象实例作为monitor对象该类所有使用了synchronized修饰的成员方法在任何时刻只能被一个线程访问其他线程需要阻塞(3)代码块使用某个对象作为monitor对象通常为一个普通的private成员变量如private Object object new Object();这样所有使用了该object对象的同步块在任何时候只能存在一个线程访问。synchronized可以与monitor对象的waitnotifynotifyAll方法一起来使用实现线程之间的通信如实现生产者和消费者模型。其中多个线程共享一个monitor对象在线程持有synchronized锁时才能调用monitor的waitnotify或者notifyAll分别用于释放monitor锁阻塞休眠等待其他线程通知和唤醒其中一个阻塞休眠的线程让该线程去获取monitor锁通知所有阻塞休眠的线程去竞争monitor锁。synchronized使用方便无需显示地在应用代码中加锁和解锁只需在对应的方法或者代码块中使用synchronized关键字修饰即可由JVM自身实现自动地加锁和释放锁。synchronized修饰的范围越小线程并发度越高性能越好所以通常使用同步代码块而不是同步方法来缩小同步范围优化性能。实现原理JVM层面synchronized关键字是基于JVM提供的monitorenter和monitorexit字节码指令以及结合监视器monitor来实现的。由上面的分析可知synchronized关键字用在静态方法普通成员方法代码块中分别需要以类对象自身类的对象实例某个普通对象作为对应的monitor对象。由JVM的相关知识可知任何java类都需要编译成class字节码然后加载到JVM当中去执行。而在编译一个java类生成对应class字节码时当遇到sychronized关键字时会在sychronized关键字所修饰的方法或者代码块的开始处增加一个monitorenter字节码指令在方法或者代码块的结束处增加monitorexit字节码指令即使用monitorenter和monitorexit字节码指令包围该方法或者代码块对应的字节码。如下在类的成员方法中使用synchronized关键字反编译该类对应的class字节码文件在成员方法method对应的字节码周围使用了monitorenter和monitorexit字节码指令。monitorenter和monitorexit指令的作用为monitorenter的作用所有线程共享该同步代码和该对象关联的监视器monitor每个线程执行到monitorenter指令的时候会检查对应的monitor对象的计数是否为0是则当前线程成为该monitor对象的owner即锁住该monitor对象了并递增该计数为1之后该线程每调用一次使用了该monitor对象进行同步的方法计数加一(所以synchronized也是可重入的)其他线程检查到monitor对象的计数不为0则知道该monitor对象已经被其他线程持有锁住了故当前线程会阻塞直到该monitor的计数重新变为0则阻塞的线程们会继续竞争成为该monitor的owner从而可以访问同步代码。monitorexit的作用当持有该monitor对象的线程每执行完一个同步代码时(如对于成员方法如果该线程调用了多个使用sychronized修饰的成员方法则每个方法执行完执行一次monitor减一)将monitor的计数减一当monitor对象的计数递减到0时则当前线程不再持有该monitor对象其他阻塞的线程此时可以竞争成为该monitor的owner成功的线程可以访问同步代码。为什么monitor对象的waitnotifynotifyAll需要在synchronized同步代码里面使用呢首先需要理解以下概念每个对象关联一个监视器monitor每个监视器monitor都有一个该对象的锁(即计数是否为0为0则说明没有其他线程加锁)一个等待队列和一个同步队列wait方法释放对象锁然后进入等待队列notify和notifyAll方法从等待队列被唤醒放到同步队列去竞争该对象锁所以线程在执行waitnotifynotifyAll时需要依赖该监视器monitor即该线程成为该监视器的owner从而可以访问synchronized包围的同步代码这样才能有权访问该监视器对应的对象锁等待队列和同步队列。操作系统层面在操作系统层面synchronized是基于操作系统的Metux Lock来实现的而操作系统实现线程之间的切换是需要进行上下文切换的即从用户态切换到内核态所以这也是synchronized相对来说成本较高性能相对较低的原因。