1.我的电脑CPU逻辑处理器为4个,相当于可以在java中同时开启4个线程并行处理
2.java中的线程执行,全部是基于系统的时间片轮转机制决定执行那个线程的
时间轮转机制:按照进程中的最小单位(线程)来一个进程的时间段的,注意不是根据进程来玩的,是根据进程中的线程来玩的
我的电脑有四个并行线程,每个线程并发执行,并发执行是根据时间轮转机制执行的,比如执行到了第一个线程我执行一半又去执行另外一个线程,就是交替执行
3.目前我有四个并行处理线程,所以进入Synchronized方法时候肯定会出现同一时刻两个线程并行抢锁的情况发生,也就是两个线程并行同时进入争夺锁,到底应该给谁因为他们是同一时刻进去的
原子性:被synchronized修饰的代码在同一时间只能被一个线程访问,就算有两个线程是同一时刻进去的,进入时间点一模一样,也会有操作系统指令集的执行的先后顺序的,所以可以忽略这个问题,系统操作指令集会有一个先后处理过程
//指令1
new Thread(() -> {
System.out.println(1);
}).start();
//指令2
new Thread(() -> {
System.out.println(2);
}).start();
//指令3
new Thread(() -> {
System.out.println(3);
}).start();
//指令4
new Thread(() -> {
System.out.println(4);
}).start();
意思就是你写的代码不管怎么说都有一个先后顺序,对应的会翻译成计算机可以识别的指令交给处理器去执行,处理器执行指令也会有一个先后执行顺序的,所以两个线程同一时间进入一个方法其实底层还是会有一个先后执行顺序的,只不过计算机处理速度太快了,出现了同一时间进入一个方法,其实还是会有先后顺序的。
等锁池:用来存放争夺synchronized对象锁争夺失败的线程,里面是随机唤醒线程再次去获取synchronized对象锁,并不是线程先进先出的原则,比如有线程A,线程B,线程C,线程A拿到了对象锁用完了释放完毕,等锁池中的线程B,线程C,等锁池会随机唤醒一个继续去获取对象锁,获取成功从等锁池中移除,获取失败继续在等锁池中待在等待下一次获取对象锁的机会