四、加锁或信号量机制
悲观锁:加锁就是给我们数据对象加一个标记,比如说原本数据的标识为0,当一个任务读取到当前值的时候,当前标记变为1,不在允许其他的任务进行读取操作,当前任务操作完成之后再将对象的标记为0,然后其他任务才能进行读取。
乐观锁(信号量机制):乐观锁其实就时变标记为版本号,假设当前版本为0,任务1和任务2都可以将数据读取到缓存,当任务1将数据写会到本地的时候,版本号变为了2,任务2写会数据发现自己的还是之前版本自然没办法写会回,只能将数据同步为最新版本进行重新计算。乐观锁有一个坏处就是当有大量的并发的时候比如10000个任务,当有一个任务修改了内存,那么意味着剩下的所有任务的计算都会失去意义,着样会大大的损耗我们cpu的性能
总结:悲观锁适合高并发,乐观锁适合低并发
五、创建线程,执行同时执行多个任务
首先我们新建一个类ThreadNew
public class ThreadNew { private int flag; public ThreadNew(int flag){ this.flag = flag; } public void run(){ if(flag == 1){ for (int i= 0;i<1000000;i++){ System.out.println("执行任务1"); } }else { for (int i= 0;i<1000000;i++){ System.out.println("执行任务2"); } } } }
然后在main方法当中执行
public static void main(String[] args) { ThreadNew t1 = new ThreadNew(1); ThreadNew t2 = new ThreadNew(2); t1.run(); t2.run(); System.out.println("我是主方法,我是来测试顺序的"); }
虽然我们在肉眼上看到输出是同时的,但是其底层并不是一起输出的,,,原因就在于需要t1的run方法入栈执行完题的run方法才会入栈(这个地方给同学们画个图就好),这种方式是单线程的执行过程。
那如果换成多线程呢?
从输出效果上来看我们发现线程的输出的交替执行,这是因为随着内核当中的时间片的轮转,我们需要将数据不断的写会内存,写会内存的过程当中总会有线程占据总线,这样就导致了数据的来回切换。
同时我们还需要注意到,main方法当中有一个输出,这个竟然是第一个输出出来的。这说明:线程之间是相互独立的,谁也不会等待谁先执行完毕 (画出内存图)
五、创建线程,执行同时执行一个任务
可以看出上边的情况是每个线程都执行自己的任务,如果我们想让两个线程都执行同一个任务呢?
新建Person类
改造ThreadNew类
改造main方法
输出结果:0 线程之间是相互独立的
所以我们需要让,主线程去等待t1和t2两个线程执行完毕在执行
输出结果,也不是我们先要的,原因上边讲过,互相覆盖的问题