当前位置: 首页 > 后端技术 > Java

OneDaily-8.1-Synchronized,Volatile,LockDifference

时间:2023-04-01 22:55:38 Java

首先要搞清楚它们是什么,它们的特点是什么。Synchronizedsynchronized是Java内置的关键字,解决多线程间资源访问的同步问题。synchronized关键字可以保证任何时候只有一个线程可以执行它修改的方法或代码块。另外,在Java的早期版本中,synchronized是重量级锁,效率低下,因为监控锁(monitor)是依赖底层操作系统的MutexLock实现的,Java线程是映射到native线程的操作系统。向上。如果要挂起或唤醒一个线程,需要操作系统的帮助来完成,而操作系统在线程之间切换时需要从用户态切换到内核态。这些状态之间的转换需要比较长的时间,时间成本比较高,这也是早期synchronized效率低下的原因。JDK1.6对锁的实现引入了大量的优化,例如自旋锁、自适应自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术,以减少锁操作的开销。因为synchronized加锁不能主动释放锁,synchronized关键字可以保证只有一个线程可以访问synchronized代码块。synchronized使用synchronized修饰普通方法synchronized修饰静态方法synchronized(this)synchronized(xxx.class)区别:synchronized修饰普通方法和synchronized(this)可以简单理解为变量锁,它们只能实现对同一个同步执行多变的;如果它是一个不同的变量,它将被异步执行。synchronized修饰的静态方法和synchronized(xxx.class)可以简单理解为类锁。只要调用同一个类的lock方法,就可以达到同步执行的效果。VolatileVolatile保证三个并发特征之间的可见性和顺序。可见性:当一个线程修改了一个volatile变量,会立即写回主存,并导致其他线程的缓存行失效,迫使其他线程再次使用该变量,需要从内存中读取主内存。有序性:Java内存模型具有某种与生俱来的“有序性”,即不需要任何手段就可以保证的有序性。这通常称为happens-before原则。如果两个操作的执行顺序不能从happens-before原则推导出来,那么它们就不能保证它们的顺序,虚拟机可以随意重新排序。程序顺序规则:在一个线程中,按照代码顺序,写在前面的操作先于写在后面的操作发生;锁定规则:unLock操作发生在同一个锁上的lock操作之前;volatile变量规则:是的,一个变量的写操作发生在这个变量的读操作之前;转移规则:如果操作A发生在操作B之前,操作B发生在操作C之前,则可以得出操作A发生在操作C之前;线程启动规则:Thread对象的start()方法在每个操作中最先发生这个线程;线程中断规则:当被中断线程的代码检测到中断事件发生时,首先调用线程interrupt()方法;线程终止规则:线程中的所有操作都发生在线程终止检测之前。我们可以通过Thread.join()方法和Thread.isAlive()的返回值检测到线程已经终止执行;对象终止规则:一个对象的初始化首先发生在它的finalize()方法的开始处;该对象分三步初始化,由以下伪代码表示:memory=allocate();//1。分配对象的内存空间ctorInstance(memory);//2。初始化对象实例=内存;//3。设置实例指向对象的内存空间Lock常用API:Lock()、unLock()、tryLock()ReentrantLock主要定义了三个内部类,(1)抽象类Sync实现了AQS的一些方法;(2)NonfairSync实现Sync,主要用于获取非公平锁;(3)FairSync实现Sync,主要用于获取公平锁。锁三部曲:newReentantLock();代码块锁Lock.lock();finallyunlockSynchronized和Lock的区别:Synchronized是java内置关键字,Lock是Java类Synchronized不能判断获取锁的状态,Lock可以判断锁是否已经获取。synchronized不会自动释放锁,Lock会手动释放。同步的线程不会竞争,线程1不会释放,线程2会一直等下去,Lock不会一直等下去。synchronizedcanreentrantlock,cannotbeinterrupted,fairness,Lock可以重入,可以判断,默认是不公平的,但是可以自己设置.Synchronized适用于锁定少量代码的同步问题,Lock适用于大量同步代码。为什么ReentrantLock默认采用非公平模式?答:因为非公平模式效率更高。为什么非公平模式效率更高?答:因为非公平模式一开始会尝试获取锁两次,如果此时state的值刚好为0,就会成功获取锁,减少排队带来的阻塞/唤醒过程,减少频繁的线程。切换造成的性能损失。不公平模型的缺点是什么?答:非公平模式可能会导致最开始排队的线程无法获得锁,导致线程饥饿。不同的是使用synchronized锁不能主动释放锁,会涉及到死锁的问题。同步代码块简单来说就是用一把锁锁住一段代码,只有获得锁的线程才能访问,同时只有一个线程可以持有锁,从而保证只有一个线程可以持有一个线程可以同时执行加锁的代码//获取锁voidlock();//获取锁(可以中断)voidlockInterruptibly()throwsInterruptedException;//尝试获取锁,如果未获取锁,returnfalsebooleantryLock();//尝试获取锁。如果没有获取到锁,则等待一段时间。如果在此期间没有获取到锁,则返回falsebooleantryLock(longtime,TimeUnitunit)throwsInterruptedException;//释放锁voidunlock();//条件锁ConditionnewCondition();