synchronized锁和lock锁 队列中线程执行顺序对比
背景
最近复习一下多线程,上面说到synchronized是将被阻塞的现场放到一个虚拟队列(Lock-Free无锁机制)中,而Lock是通过AQS队列存放阻塞的线程。那synchronized里的线程默认是怎么竞争锁的,Lock又是如何?
之前记录的结论:
思路
开启一个死循环,然后让多个线程竞争通一把锁,被阻塞的线程孜然就会被放到对应的阻塞队列里,执行时打印线程的名字,然后根据打印的结果判断顺序
先验证synchronized的情况,创建一个runnable实现类,然后共享成员变量map
public class MyThread implements Runnable{Map<String,String> map;public Map<String, String> getMap() {return map;}public void setMap(Map<String, String> map) {this.map = map;}@Overridepublic void run() {while (true){try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}synchronized (map){System.out.println(Thread.currentThread().getName()+"拿到了锁");try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"结束了");}}}
}
在主方法中执行
public static void main(String[] args) {Map<String, String> map = new HashMap<>();for (int i = 0; i < 10; i++) {MyThread myThread = new MyThread();myThread.setMap(map);Thread thread = new Thread(myThread);System.out.println(thread.getName()+"开始启动了");thread.start();}System.out.println("主线程结束了");}
结果:线程竞争结果无顺序,可以认为当一个线程释放锁资源时,队列中的其他线程都在竞争?
Thread-0开始启动了
Thread-1开始启动了
Thread-2开始启动了
Thread-3开始启动了
Thread-4开始启动了
Thread-5开始启动了
Thread-6开始启动了
Thread-7开始启动了
Thread-8开始启动了
Thread-9开始启动了
主线程结束了
Thread-0拿到了锁
Thread-0结束了
Thread-9拿到了锁
Thread-9结束了
Thread-1拿到了锁
Thread-1结束了
Thread-4拿到了锁
Thread-4结束了
Thread-6拿到了锁
Thread-6结束了
Thread-2拿到了锁
Thread-2结束了
Thread-8拿到了锁
Thread-8结束了
Thread-7拿到了锁
Thread-7结束了
Thread-5拿到了锁
Thread-5结束了
Thread-3拿到了锁
Thread-3结束了
Thread-5拿到了锁
Thread-5结束了
Thread-7拿到了锁
Thread-7结束了
Thread-8拿到了锁
Thread-8结束了
Thread-2拿到了锁
验证Lock锁的情况,通过共享一个ReentrantLock对象。
public class MyThread2 implements Runnable{ReentrantLock reentrantLock ;public ReentrantLock getReentrantLock() {return reentrantLock;}public void setReentrantLock(ReentrantLock reentrantLock) {this.reentrantLock = reentrantLock;}@Overridepublic void run() {while (true){try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}reentrantLock.lock();System.out.println(Thread.currentThread().getName()+"拿到了锁");try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"结束了");reentrantLock.unlock();}}
}
主线程
public static void main(String[] args) {ReentrantLock reentrantLock = new ReentrantLock(false);for (int i = 0; i < 5; i++) {MyThread2 myThread2 = new MyThread2();myThread2.setReentrantLock(reentrantLock);Thread thread = new Thread(myThread2);System.out.println(thread.getName()+"开始启动了");thread.start();}}
结果可见,线程执行是有顺序的,确实是按照顺序不停更换头结点,循环,有序拿到锁的。
Thread-0开始启动了
Thread-1开始启动了
Thread-2开始启动了
Thread-3开始启动了
Thread-4开始启动了
Thread-1拿到了锁
Thread-1结束了
Thread-0拿到了锁
Thread-0结束了
Thread-2拿到了锁
Thread-2结束了
Thread-3拿到了锁
Thread-3结束了
Thread-4拿到了锁
Thread-4结束了
Thread-1拿到了锁
Thread-1结束了
Thread-0拿到了锁
Thread-0结束了
Thread-2拿到了锁
Thread-2结束了
Thread-3拿到了锁
Thread-3结束了
Thread-4拿到了锁
Thread-4结束了
Thread-1拿到了锁
Thread-1结束了
Thread-0拿到了锁
Thread-0结束了
Thread-2拿到了锁
Thread-2结束了
Thread-3拿到了锁
Thread-3结束了
Thread-4拿到了锁
这里有个疑问就是公平锁的问题,公平锁反应的应该是新来的线程是否应该排队吧,已经在CLH队列里的线程就是按照顺序执行,跟是否公平无关吧?
这里证明一下,先让5个线程都打印完,得以判断出最初的队列顺序,然后再突然让5个新的线程去竞争,看看这5个线程是否会排到后面。
public static void main(String[] args) {ReentrantLock reentrantLock = new ReentrantLock(false);for (int i = 0; i < 5; i++) {MyThread2 myThread2 = new MyThread2();myThread2.setReentrantLock(reentrantLock);Thread thread = new Thread(myThread2);System.out.println(thread.getName()+"开始启动了");thread.start();}try {Thread.sleep(3500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("开始加入额外线程");for (int i = 0; i < 10; i++) {MyThread2 myThread2 = new MyThread2();myThread2.setReentrantLock(reentrantLock);Thread thread = new Thread(myThread2);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}thread.start();}System.out.println("主线程结束了");}
设置的Lock锁为false,为不公平锁
最初顺序为3,2,4,1,0,最后结果成了3,10,5,11,2,12,6,13,4,14,7,1,8等等
根据结果可以发现确实有插队情况出现了,确实符合理论。
Thread-0开始启动了
Thread-1开始启动了
Thread-2开始启动了
Thread-3开始启动了
Thread-4开始启动了
Thread-3拿到了锁
Thread-3结束了
Thread-2拿到了锁
Thread-2结束了
Thread-4拿到了锁
Thread-4结束了
Thread-1拿到了锁
Thread-1结束了
Thread-0拿到了锁
Thread-0结束了
Thread-3拿到了锁
开始加入额外线程
Thread-3结束了
Thread-2拿到了锁
Thread-2结束了
Thread-4拿到了锁
Thread-4结束了
Thread-1拿到了锁
Thread-1结束了
Thread-0拿到了锁
Thread-0结束了
Thread-3拿到了锁
Thread-3结束了
Thread-5拿到了锁
Thread-5结束了
Thread-2拿到了锁
Thread-2结束了
Thread-6拿到了锁
Thread-6结束了
Thread-4拿到了锁
Thread-4结束了
Thread-7拿到了锁
主线程结束了
Thread-7结束了
Thread-1拿到了锁
Thread-1结束了
Thread-8拿到了锁
Thread-8结束了
Thread-0拿到了锁
Thread-0结束了
Thread-9拿到了锁
Thread-9结束了
Thread-3拿到了锁
Thread-3结束了
Thread-10拿到了锁
Thread-10结束了
Thread-5拿到了锁
Thread-5结束了
Thread-11拿到了锁
Thread-11结束了
Thread-2拿到了锁
Thread-2结束了
Thread-12拿到了锁
Thread-12结束了
Thread-6拿到了锁
Thread-6结束了
Thread-13拿到了锁
Thread-13结束了
Thread-4拿到了锁
Thread-4结束了
Thread-14拿到了锁
Thread-14结束了
Thread-7拿到了锁
Thread-7结束了
Thread-1拿到了锁
Thread-1结束了
Thread-8拿到了锁
现在改成ture,也就是公平锁,看看结果如何
结果显示不符合预期效果,想了一下,因为CLH他是一个带头结点的双向链表,也就是说他的链表是一直在变化的,所以顺序肯定不会是固定的,头结点释放以后,多个线程同时竞争尾部,然后再依次往前排,顺序势必会打乱。
Thread-0开始启动了
Thread-1开始启动了
Thread-2开始启动了
Thread-3开始启动了
Thread-4开始启动了
Thread-3拿到了锁
Thread-3结束了
Thread-2拿到了锁
Thread-2结束了
Thread-4拿到了锁
Thread-4结束了
Thread-1拿到了锁
Thread-1结束了
Thread-0拿到了锁
Thread-0结束了
Thread-3拿到了锁
开始加入额外线程
Thread-3结束了
Thread-2拿到了锁
Thread-2结束了
Thread-4拿到了锁
Thread-4结束了
Thread-1拿到了锁
Thread-1结束了
Thread-0拿到了锁
Thread-0结束了
Thread-3拿到了锁
Thread-3结束了
Thread-5拿到了锁
Thread-5结束了
Thread-2拿到了锁
Thread-2结束了
Thread-6拿到了锁
Thread-6结束了
Thread-4拿到了锁
Thread-4结束了
Thread-7拿到了锁
主线程结束了
Thread-7结束了
Thread-1拿到了锁
Thread-1结束了
Thread-8拿到了锁
Thread-8结束了
Thread-0拿到了锁
Thread-0结束了
Thread-9拿到了锁
Thread-9结束了
Thread-3拿到了锁
Thread-3结束了
Thread-10拿到了锁
Thread-10结束了
Thread-5拿到了锁
Thread-5结束了
Thread-11拿到了锁
Thread-11结束了
Thread-2拿到了锁
Thread-2结束了
Thread-12拿到了锁
Thread-12结束了
Thread-6拿到了锁
Thread-6结束了
Thread-13拿到了锁
Thread-13结束了
Thread-4拿到了锁
Thread-4结束了
Thread-14拿到了锁
Thread-14结束了
Thread-7拿到了锁
Thread-7结束了
Thread-1拿到了锁
Thread-1结束了
Thread-8拿到了锁
进一步改造一下ReentrantLock ,打印出他的队列内的元素。
public class ReentrantLockMine extends ReentrantLock {public ReentrantLockMine(boolean fair) {super(fair);}@Overrideprotected Collection<Thread> getQueuedThreads() { //获取同步队列中的线程List<Thread> arrayList = new ArrayList<Thread>(super.getQueuedThreads());Collections.reverse(arrayList);return arrayList;}}
这边也是改一下内部的成员变量
public class MyThread2 implements Runnable{ReentrantLockMine reentrantLock ;public ReentrantLock getReentrantLock() {return reentrantLock;}public void setReentrantLock(ReentrantLockMine reentrantLock) {this.reentrantLock = reentrantLock;}@Overridepublic void run() {while (true){reentrantLock.lock();System.out.println(Thread.currentThread().getName()+"拿到了锁,當前隊列:"+((ReentrantLockMine)reentrantLock).getQueuedThreads());try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"结束了");reentrantLock.unlock();}}
}
测试方法
public static void main(String[] args) {ReentrantLockMine reentrantLock = new ReentrantLockMine(false);for (int i = 0; i < 5; i++) {MyThread2 myThread2 = new MyThread2();myThread2.setReentrantLock(reentrantLock);Thread thread = new Thread(myThread2);System.out.println(thread.getName()+"开始启动了");thread.start();}try {Thread.sleep(1500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("开始加入额外线程");for (int i = 0; i < 10; i++) {MyThread2 myThread2 = new MyThread2();myThread2.setReentrantLock(reentrantLock);Thread thread = new Thread(myThread2);thread.start();}System.out.println("主线程结束了");}
非公平结果:
可以发现,之后加入的线程全部按照顺序排在了后面,0号线程拿到线程后又插队获取到锁,继续执行,其他线程拿不到锁。
Thread-0开始启动了
Thread-1开始启动了
Thread-2开始启动了
Thread-3开始启动了
Thread-4开始启动了
Thread-0拿到了锁,當前隊列:[]
Thread-0结束了
Thread-0拿到了锁,當前隊列:[Thread[Thread-1,5,main], Thread[Thread-4,5,main], Thread[Thread-2,5,main], Thread[Thread-3,5,main]]
Thread-0结束了
Thread-0拿到了锁,當前隊列:[Thread[Thread-1,5,main], Thread[Thread-4,5,main], Thread[Thread-2,5,main], Thread[Thread-3,5,main]]
开始加入额外线程
主线程结束了
Thread-0结束了
Thread-0拿到了锁,當前隊列:[Thread[Thread-1,5,main], Thread[Thread-4,5,main], Thread[Thread-2,5,main], Thread[Thread-3,5,main], Thread[Thread-5,5,main], Thread[Thread-7,5,main], Thread[Thread-6,5,main], Thread[Thread-8,5,main], Thread[Thread-12,5,main], Thread[Thread-10,5,main], Thread[Thread-11,5,main], Thread[Thread-9,5,main], Thread[Thread-13,5,main], Thread[Thread-14,5,main]]
Thread-0结束了
Thread-0拿到了锁,當前隊列:[Thread[Thread-1,5,main], Thread[Thread-4,5,main], Thread[Thread-2,5,main], Thread[Thread-3,5,main], Thread[Thread-5,5,main], Thread[Thread-7,5,main], Thread[Thread-6,5,main], Thread[Thread-8,5,main], Thread[Thread-12,5,main], Thread[Thread-10,5,main], Thread[Thread-11,5,main], Thread[Thread-9,5,main], Thread[Thread-13,5,main], Thread[Thread-14,5,main]]
Thread-0结束了
Thread-0拿到了锁,當前隊列:[Thread[Thread-1,5,main], Thread[Thread-4,5,main], Thread[Thread-2,5,main], Thread[Thread-3,5,main], Thread[Thread-5,5,main], Thread[Thread-7,5,main], Thread[Thread-6,5,main], Thread[Thread-8,5,main], Thread[Thread-12,5,main], Thread[Thread-10,5,main], Thread[Thread-11,5,main], Thread[Thread-9,5,main], Thread[Thread-13,5,main], Thread[Thread-14,5,main]]
公平锁结果:
可以发现全部按照队列顺序去执行了,不存在某个线程一直获取资源,符合预期效果。
Thread-0开始启动了
Thread-1开始启动了
Thread-2开始启动了
Thread-3开始启动了
Thread-4开始启动了
Thread-0拿到了锁,當前隊列:[]
Thread-0结束了
Thread-1拿到了锁,當前隊列:[Thread[Thread-4,5,main], Thread[Thread-2,5,main], Thread[Thread-3,5,main], Thread[Thread-0,5,main]]
Thread-1结束了
Thread-4拿到了锁,當前隊列:[Thread[Thread-2,5,main], Thread[Thread-3,5,main], Thread[Thread-0,5,main], Thread[Thread-1,5,main]]
开始加入额外线程
主线程结束了
Thread-4结束了
Thread-2拿到了锁,當前隊列:[Thread[Thread-3,5,main], Thread[Thread-0,5,main], Thread[Thread-1,5,main], Thread[Thread-5,5,main], Thread[Thread-7,5,main], Thread[Thread-6,5,main], Thread[Thread-8,5,main], Thread[Thread-9,5,main], Thread[Thread-10,5,main], Thread[Thread-11,5,main], Thread[Thread-12,5,main], Thread[Thread-13,5,main], Thread[Thread-14,5,main], Thread[Thread-4,5,main]]
Thread-2结束了
Thread-3拿到了锁,當前隊列:[Thread[Thread-0,5,main], Thread[Thread-1,5,main], Thread[Thread-5,5,main], Thread[Thread-7,5,main], Thread[Thread-6,5,main], Thread[Thread-8,5,main], Thread[Thread-9,5,main], Thread[Thread-10,5,main], Thread[Thread-11,5,main], Thread[Thread-12,5,main], Thread[Thread-13,5,main], Thread[Thread-14,5,main], Thread[Thread-4,5,main], Thread[Thread-2,5,main]]
Thread-3结束了
Thread-0拿到了锁,當前隊列:[Thread[Thread-1,5,main], Thread[Thread-5,5,main], Thread[Thread-7,5,main], Thread[Thread-6,5,main], Thread[Thread-8,5,main], Thread[Thread-9,5,main], Thread[Thread-10,5,main], Thread[Thread-11,5,main], Thread[Thread-12,5,main], Thread[Thread-13,5,main], Thread[Thread-14,5,main], Thread[Thread-4,5,main], Thread[Thread-2,5,main], Thread[Thread-3,5,main]]
Thread-0结束了
Thread-1拿到了锁,當前隊列:[Thread[Thread-5,5,main], Thread[Thread-7,5,main], Thread[Thread-6,5,main], Thread[Thread-8,5,main], Thread[Thread-9,5,main], Thread[Thread-10,5,main], Thread[Thread-11,5,main], Thread[Thread-12,5,main], Thread[Thread-13,5,main], Thread[Thread-14,5,main], Thread[Thread-4,5,main], Thread[Thread-2,5,main], Thread[Thread-3,5,main], Thread[Thread-0,5,main]]
Thread-1结束了
Thread-5拿到了锁,當前隊列:[Thread[Thread-7,5,main], Thread[Thread-6,5,main], Thread[Thread-8,5,main], Thread[Thread-9,5,main], Thread[Thread-10,5,main], Thread[Thread-11,5,main], Thread[Thread-12,5,main], Thread[Thread-13,5,main], Thread[Thread-14,5,main], Thread[Thread-4,5,main], Thread[Thread-2,5,main], Thread[Thread-3,5,main], Thread[Thread-0,5,main], Thread[Thread-1,5,main]]
Thread-5结束了
Thread-7拿到了锁,當前隊列:[Thread[Thread-6,5,main], Thread[Thread-8,5,main], Thread[Thread-9,5,main], Thread[Thread-10,5,main], Thread[Thread-11,5,main], Thread[Thread-12,5,main], Thread[Thread-13,5,main], Thread[Thread-14,5,main], Thread[Thread-4,5,main], Thread[Thread-2,5,main], Thread[Thread-3,5,main], Thread[Thread-0,5,main], Thread[Thread-1,5,main], Thread[Thread-5,5,main]]
Thread-7结束了
Thread-6拿到了锁,當前隊列:[Thread[Thread-8,5,main], Thread[Thread-9,5,main], Thread[Thread-10,5,main], Thread[Thread-11,5,main], Thread[Thread-12,5,main], Thread[Thread-13,5,main], Thread[Thread-14,5,main], Thread[Thread-4,5,main], Thread[Thread-2,5,main], Thread[Thread-3,5,main], Thread[Thread-0,5,main], Thread[Thread-1,5,main], Thread[Thread-5,5,main], Thread[Thread-7,5,main]]
Thread-6结束了
Thread-8拿到了锁,當前隊列:[Thread[Thread-9,5,main], Thread[Thread-10,5,main], Thread[Thread-11,5,main], Thread[Thread-12,5,main], Thread[Thread-13,5,main], Thread[Thread-14,5,main], Thread[Thread-4,5,main], Thread[Thread-2,5,main], Thread[Thread-3,5,main], Thread[Thread-0,5,main], Thread[Thread-1,5,main], Thread[Thread-5,5,main], Thread[Thread-7,5,main], Thread[Thread-6,5,main]]
Thread-8结束了
Thread-9拿到了锁,當前隊列:[Thread[Thread-10,5,main], Thread[Thread-11,5,main], Thread[Thread-12,5,main], Thread[Thread-13,5,main], Thread[Thread-14,5,main], Thread[Thread-4,5,main], Thread[Thread-2,5,main], Thread[Thread-3,5,main], Thread[Thread-0,5,main], Thread[Thread-1,5,main], Thread[Thread-5,5,main], Thread[Thread-7,5,main], Thread[Thread-6,5,main], Thread[Thread-8,5,main]]
Thread-9结束了
Thread-10拿到了锁,當前隊列:[Thread[Thread-11,5,main], Thread[Thread-12,5,main], Thread[Thread-13,5,main], Thread[Thread-14,5,main], Thread[Thread-4,5,main], Thread[Thread-2,5,main], Thread[Thread-3,5,main], Thread[Thread-0,5,main], Thread[Thread-1,5,main], Thread[Thread-5,5,main], Thread[Thread-7,5,main], Thread[Thread-6,5,main], Thread[Thread-8,5,main], Thread[Thread-9,5,main]]
Thread-10结束了
Thread-11拿到了锁,當前隊列:[Thread[Thread-12,5,main], Thread[Thread-13,5,main], Thread[Thread-14,5,main], Thread[Thread-4,5,main], Thread[Thread-2,5,main], Thread[Thread-3,5,main], Thread[Thread-0,5,main], Thread[Thread-1,5,main], Thread[Thread-5,5,main], Thread[Thread-7,5,main], Thread[Thread-6,5,main], Thread[Thread-8,5,main], Thread[Thread-9,5,main], Thread[Thread-10,5,main]]
Thread-11结束了
Thread-12拿到了锁,當前隊列:[Thread[Thread-13,5,main], Thread[Thread-14,5,main], Thread[Thread-4,5,main], Thread[Thread-2,5,main], Thread[Thread-3,5,main], Thread[Thread-0,5,main], Thread[Thread-1,5,main], Thread[Thread-5,5,main], Thread[Thread-7,5,main], Thread[Thread-6,5,main], Thread[Thread-8,5,main], Thread[Thread-9,5,main], Thread[Thread-10,5,main], Thread[Thread-11,5,main]]
Thread-12结束了
Thread-13拿到了锁,當前隊列:[Thread[Thread-14,5,main], Thread[Thread-4,5,main], Thread[Thread-2,5,main], Thread[Thread-3,5,main], Thread[Thread-0,5,main], Thread[Thread-1,5,main], Thread[Thread-5,5,main], Thread[Thread-7,5,main], Thread[Thread-6,5,main], Thread[Thread-8,5,main], Thread[Thread-9,5,main], Thread[Thread-10,5,main], Thread[Thread-11,5,main], Thread[Thread-12,5,main]]
Thread-13结束了
Thread-14拿到了锁,當前隊列:[Thread[Thread-4,5,main], Thread[Thread-2,5,main], Thread[Thread-3,5,main], Thread[Thread-0,5,main], Thread[Thread-1,5,main], Thread[Thread-5,5,main], Thread[Thread-7,5,main], Thread[Thread-6,5,main], Thread[Thread-8,5,main], Thread[Thread-9,5,main], Thread[Thread-10,5,main], Thread[Thread-11,5,main], Thread[Thread-12,5,main], Thread[Thread-13,5,main]]
Thread-14结束了
Thread-4拿到了锁,當前隊列:[Thread[Thread-2,5,main], Thread[Thread-3,5,main], Thread[Thread-0,5,main], Thread[Thread-1,5,main], Thread[Thread-5,5,main], Thread[Thread-7,5,main], Thread[Thread-6,5,main], Thread[Thread-8,5,main], Thread[Thread-9,5,main], Thread[Thread-10,5,main], Thread[Thread-11,5,main], Thread[Thread-12,5,main], Thread[Thread-13,5,main], Thread[Thread-14,5,main]]
Thread-4结束了
Thread-2拿到了锁,當前隊列:[Thread[Thread-3,5,main], Thread[Thread-0,5,main], Thread[Thread-1,5,main], Thread[Thread-5,5,main], Thread[Thread-7,5,main], Thread[Thread-6,5,main], Thread[Thread-8,5,main], Thread[Thread-9,5,main], Thread[Thread-10,5,main], Thread[Thread-11,5,main], Thread[Thread-12,5,main], Thread[Thread-13,5,main], Thread[Thread-14,5,main], Thread[Thread-4,5,main]]
Thread-2结束了
Thread-3拿到了锁,當前隊列:[Thread[Thread-0,5,main], Thread[Thread-1,5,main], Thread[Thread-5,5,main], Thread[Thread-7,5,main], Thread[Thread-6,5,main], Thread[Thread-8,5,main], Thread[Thread-9,5,main], Thread[Thread-10,5,main], Thread[Thread-11,5,main], Thread[Thread-12,5,main], Thread[Thread-13,5,main], Thread[Thread-14,5,main], Thread[Thread-4,5,main], Thread[Thread-2,5,main]]
结论
synchronized的队列似乎并不有序,根据Lock-Free的解释,它属于一个虚拟的队列,队列里的各个数据都在竞争锁。
Lock严格按照队列顺序执行,若非公平锁状态则可能被非队列中的现场插队执行,公平锁状态下按照队列顺序,只有头结点才回去尝试获取锁,和synchronized都在竞争锁情况相比可能更节省资源?但是同一时刻多线程入队的顺序是不确定的(雾)。
synchronized锁和lock锁 队列中线程执行顺序对比相关推荐
- 萌新必入!手把手教你玩转Synchronized锁和Lock锁!
文章目录 声明 前言 Synchronized锁 Lock锁 Synchronized与Lock区别 生产者与消费者问题 Synchronized Lock 8锁现象 后记 声明 1)该文章部分内容整 ...
- 日志打印、main函数中代码执行顺序
文章目录 1.设置时区 2.日志打印 3.main函数中代码执行顺序 1.设置时区 我们要设置成 CST 时区,以保证正确地显示日期.时间. 我们常看到的时区有如下几个: PST:美国太平洋标准时间, ...
- Unity脚本在层级面板中的执行顺序测试3
断断续续的写了3篇,以后有时间可以做成一个系列了 前面2篇测试了GameObject的顺序,以及Awake和OnEnable的时机: Unity脚本在层级面板中的执行顺序测试1 http://www. ...
- 【总结篇】继承中的执行顺序
作者:✿✿ xxxflower. ✿✿ <总结篇> 这个专题就记录一些自己在练习中所学习到的. 包括一些不熟悉的芝士点和一些小的细节. 今天我们来总结一下继承中的执行顺序. 首先执行静态的 ...
- Java 对synchronized的补充Lock锁
Java并发编程:Lock 从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock. 也许有朋友会问,既然都可以通过synchr ...
- mysql读写分离主从原理、事务隔离级别及使用、锁表和锁行场景、乐观锁和悲观锁、lock锁和sychronized区别及使用自己学习之后总结和参考一些博客感觉系统了解了
synchronized与Lock的区别 两者区别: 1.首先synchronized是java内置关键字,在jvm层面,Lock是个java类: 2.synchronized无法判断是否获取锁的状态 ...
- 【分析】浅谈C#中Control的Invoke与BeginInvoke在主副线程中的执行顺序和区别(SamWang)
今天无意中看到有关Invoke和BeginInvoke的一些资料,不太清楚它们之间的区别.所以花了点时间研究了下. 据msdn中介绍,它们最大的区别就是BeginInvoke属于异步执行的. Cont ...
- java中线程执行顺序控制
一:join()方法. thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程.比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行 ...
- jmeter 线程执行顺序_面试官让我说出8种线程顺序执行的方法!我懵了
https://www.cnblogs.com/wenjunwei/p/10573289.html 一.前言 本文使用了8种方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止 ...
- 关于线程执行顺序的问题
R君今天曾问我:假设现在有三个线程T1.T2.T3.那么他希望T1.T2.T3这三个线程按照顺序去执行,该怎么去完成.我本能的反应是这个好办,使用thread.jon()方法完全可以实现.接着他又问, ...
最新文章
- 神经网络结构设计指导原则——输入层:神经元个数=feature维度 输出层:神经元个数=分类类别数,默认只用一个隐层 如果用多个隐层,则每个隐层的神经元数目都一样...
- python画直方图代码-Python使用Plotly绘图工具,绘制直方图
- python编程从入门到精通 叶维忠 pdf-最好的Python入门教材是哪本?
- Linux如何指向mysql_linux的基本操作(mysql 的基本操作)
- .NET Core 3.0之深入源码理解HealthCheck(一)
- leetcode1045. 买下所有产品的客户(SQL)
- java teechart怎么用_TeeChart使用范例
- Dijkstra算法(c++版)
- LeetCode 234 Palindrome Linked List
- -1在numpy重塑中是什么意思?
- MATLAB Simulink仿真应用
- 网页与多个服务器建立websoc,同一个页面怎么发起多个websocket
- javascript 图像二值化处理
- Java实习日记(7)
- 51单片机串口中断控制灯
- js去除url中的localtion.search部分
- 使用python自动上传apk到蒲公英
- mac 命令行 解压7z文件_命令行压缩解压缩一 7z
- 获取一个新的日期,它的值为指定日期当年的最后一天
- 「108套商业案例」烧烤店1元吃小龙虾,15天收款70万并自动裂变
热门文章
- Python性能加速
- 424.替换后的最长重复字符
- numpy.squeeze()的用法
- 二叉树的inorder实现:递归、栈、Morris遍历
- 2015-11-23 12:50:55
- 机器学习-KMeans聚类 K值以及初始类簇中心点的选取
- 【面向代码】学习 Deep Learning(三)Convolution Neural Network(CNN)
- 【ML小结10】集成学习
- pause容器作用_Kubernetes pod里一个特殊的容器:pause-amd64
- 网络安全基础——破解系统密码