首页 > 其他分享 >一点点JUC的小姿势

一点点JUC的小姿势

时间:2023-10-04 17:01:04浏览次数:30  
标签:姿势 JUC Thread lock 一点点 线程 Lock sleep wait

1 JUC

JUC就是java.util.concurrent下面的类包,专门用于多线程的开发。

1.1 并发与并行

  1. 并发

多线程操作同一个资源。

  • CPU 只有一核,模拟出来多条线程,天下武功,唯快不破。那么我们就可以使用CPU快速交替,来模拟多线程。
  • 并发编程的本质:充分利用CPU的资源!
  1. 并行

并行: 多个人一起行走

  • CPU多核,多个线程可以同时执行。 我们可以使用线程池!

1.2 线程的状态

public enum State {	
	//新生
    NEW,

	//运行
    RUNNABLE,

	//阻塞
    BLOCKED,

	//等待
    WAITING,

	//超时等待
    TIMED_WAITING,

	//终止
    TERMINATED;
}

1.3 wait/sleep

1、这两个方法来自不同的类分别是,sleep来自Thread类,和wait来自Object类。

sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep。

2.最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。
Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。

3、使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用

4、sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

 synchronized(x){ 
      x.notify() 
     //或者wait() 
   }

2 Lock锁

2.1 传统的 synchronized

public synchronized void sale(){
    if (sum > 0)
        System.out.println(Thread.currentThread().getName() + "获得了第:"+ sum + "张票,此时还剩 " + --sum);
}

2.2 Synchronized 和 Lock 的区别

  1. Synchronized 是Java的内置关键字,Lock是一个Java类
  2. Synchronized 无法判断获取锁的状态,而Lock可以
  3. Synchronized 会自动释放锁,Lock必须手动释放,否则死锁
  4. Synchronized 会造成阻塞,Lock不一定会
  5. Synchronized 可重入锁,不可以中断,非公平; Lock 可重入锁,可以判断锁,公平性可以自定义
  6. Synchronized 适合少量代码的同步问题,Lock适合锁大量的同步代码

2.3 精准控制线程顺序

public class ProductAndConsumer02 {

    public static void main(String[] args) {

        Data data = new Data();
        new Thread(() -> {for (int i = 0; i < 10; i++) data.printA();},"A").start();
        new Thread(() -> {for (int i = 0; i < 10; i++) data.printB();},"B").start();
        new Thread(() -> {for (int i = 0; i < 10; i++) data.printC();},"C").start();
    }
}


class Data{

    private static int num = 1;

    private Lock lock = new ReentrantLock();

    private Condition condition1 = lock.newCondition();

    private Condition condition2 = lock.newCondition();

    private Condition condition3 = lock.newCondition();

    public void printA(){
        lock.lock();

        try {
            while (num != 1){
                condition1.await();
            }
            System.out.println(Thread.currentThread().getName() + ":   "+ "AAAAAAA");
            //num = 2;
            condition2.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }

    }

    public void printB(){
        System.out.println("B lock");
        lock.lock();

        try {
             if (num != 2){
                condition2.await();
            }
            System.out.println(Thread.currentThread().getName() + ":   "+ "BBBBBBB");
            num = 3;
            condition3.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }

    }
    public void printC(){
        lock.lock();

        try {
            while (num != 3){
                condition3.await();
            }
            System.out.println(Thread.currentThread().getName() + ":   "+ "CCCCCCC");
            num = 1;
            condition1.signal();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }

    }

}

标签:姿势,JUC,Thread,lock,一点点,线程,Lock,sleep,wait
From: https://www.cnblogs.com/shenzizai/p/17742460.html

相关文章

  • JUC并发编程---Lock锁
    文章目录什么是Locksynchronized加锁和Lock加锁代码示例synchronized使用Lock加锁公平锁和非公平锁公平锁:非公平锁:Lock和Synchronized的区别synchronized版的生产者和消费者Lock版的生产者和消费者生产者和消费者出现的问题Condition精准通知和唤醒线程什么是Lock官网介绍:虽然......
  • NAS是用来干嘛的?一点点解析
    随着互联网技术的发展,数据呈爆炸式增长,虽然网盘、移动硬盘方便,但功能单一,而NAS的出现,逐渐成为大多数人的选择,相比网盘、移动硬盘,将数据存储在NAS里,更安全、方便,且易于共享。在本篇文档中,我们将会介绍关于NAS设备的基本信息和NAS厂商群晖的优势,让读者对NAS有个大体的认识,知道NAS是......
  • JUC-2
    JUC-26、集合类不安全listpackagedemo02;importjava.util.*;importjava.util.concurrent.CopyOnWriteArrayList;//.ConcurrentModificationException并发修改异常publicclassDay92300{publicstaticvoidmain(String[]args){/*并发下Ar......
  • 一点点题
    Trees题意:有n颗树,要求第i颗和第n-i+1颗高度要相同,并且第i颗和第i+1颗相差为1且递增(对于前一半来说)现在一个操作是可以把任意一棵树修改为任意高度,给定树的高度序列,求出最小操作数分析:因为树的高度要求以1递增,而位置也是递增的,所以如果存在一个序列满足树的高度要求,那么每棵树......
  • 267_Windows自带文件批量标号新姿势,1秒完成!
    这是一篇原发布于2020-01-2715:30:00得益小站的文章,备份在此处。前言今天的教程非常的短!非常短!保证看完就会,所以我不要你收藏,我要你学会!一个个的都只收藏,不点赞,你这样我很难做啊。——还是要收藏的,要收藏的,收藏也好,收藏也好...教程开始1.全选需要修改名称的文件2.按f2......
  • JUC-1
    JUC-11、什么是JUC源码+官方文档面试高频问!java.util工具包、包、分类业务∶普通的线程代码ThreadRunnable没有返回值、效率相比入Callable相对较低!2、线程和进程线程、进程,如果不能使用一句话说出来的技术,不扎实!进程:—个程序,QQ.exeMusic.exe程序的集合;一个进程往......
  • 【.NET8】访问私有成员新姿势UnsafeAccessor(下)
    前言书接上回,我们讨论了在.NET8中新增的UnsafeAccessor,并且通过UnsafeAccessor访问了私有成员,这极大的方便了我们代码的编写,当然也聊到了它当前存在的一些局限性,那么它的性能到底如何?我们今天就来实际测试一下。测试代码话不多说,直接上代码,本次测试代码如下:usingSystem.Linq.......
  • 全网最详细Java-JUC
    Java-JUC⓪基础❶进程&线程进程:指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间。线程:比进程更小的执行单位,一个进程可以启动多个线程,每条线程并行执行不同的任务。❷并行&并发并行(Parallel):在同一时刻,有多个指令在多个CPU上同时执行。并发(Concurrent):在......
  • 【.NET8】访问私有成员新姿势UnsafeAccessor(上)
    前言前几天在.NET性能优化群里面,有群友聊到了.NET8新增的一个特性,这个类叫UnsafeAccessor,有很多群友都不知道这个特性是干嘛的,所以我就想写一篇文章来带大家了解一下这个特性。其实在很早之前我就有关注到这个特殊的特性,但是当时.NET8还没有正式发布,所以我也没有写文章,现在.NET8......
  • 25届实习秋招-Java面试-JUC多线程面试题整理-牛客网
    JUC介绍一下JUC下的锁(如何使用及应用场景)线程什么是进程:特征什么是线程:资源为什么多线程,什么使用用单线程,什么时候多线程,什么条件下多线程快。进程和线程的对比:进程如何通信,每种通信存放的介质。||线程的通信,几种方式。join进程和线程的区别,在JVM层面的体现一......