【无标题】

四、加锁或信号量机制

悲观锁:加锁就是给我们数据对象加一个标记,比如说原本数据的标识为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两个线程执行完毕在执行

【无标题】

输出结果,也不是我们先要的,原因上边讲过,互相覆盖的问题

【无标题】

上一篇:SpringApplication.run(xxx.class, args)背后的东东——实现原理


下一篇:【解决】ERROR Failed to compile with 1 error;error in ./node_modules/pdfjs-dist/build/pdf.js