【无标题】

本文探讨了悲观锁和乐观锁(信号量机制)在并发控制中的应用,指出悲观锁适合高并发,而乐观锁适合低并发场景。通过实例展示了Java中线程的创建与执行,解释了单线程和多线程执行的区别,强调了线程间的独立性和同步问题。
摘要由CSDN通过智能技术生成

四、加锁或信号量机制

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值