Java教程

【无标题】

本文主要是介绍【无标题】,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

四、加锁或信号量机制

悲观锁:加锁就是给我们数据对象加一个标记,比如说原本数据的标识为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类

01a1a93e15362c1539b1eaadb97524cc.png

改造ThreadNew类

改造main方法

5ee4e48b427cb1aa773bc00da955c548.png

输出结果:0 线程之间是相互独立的

所以我们需要让,主线程去等待t1和t2两个线程执行完毕在执行

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

这篇关于【无标题】的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!