首页 > 其他分享 >JUC

JUC

时间:2022-12-06 00:00:22浏览次数:31  
标签:JUC Thread synchronized void 线程 sleep public

1、什么是JUC

JUC是java.util.concurrent包的简称,在Java5.0添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题!

2、线程和进程

进程:一个程序,比如QQ.exe,WeChat.exe
一个进程往往包含多个线程,至少会包含一个!!!
Java默认会开启两个线程,一个是main,一个是GC回收
Java能否开启线程?不能

public synchronized void start() {
        ...
        group.add(this);

        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            ...
        }
}
// 是一个本地方法,调用C++来开启线程,Java不能调用硬件
private native void start0();

并发和并行

并发:同一个时刻,多个任务交替进行(单核CPU实现的多任务就是并发),多个线程操作同一个资源类
并行:同一时刻,多个进程同时运行(多核CPU同时处理多个任务)

    public static void main(String[] args) {
        // 获取CPU的核数
        // 后边会说CPU密集型和IO密集型
        System.out.println(Runtime.getRuntime().availableProcessors());
    }

线程的几个状态

根据jdk源码可以看到,有6种状态

public enum State {
        // 新生状态
        NEW,

        // 运行状态
        RUNNABLE,

        // 阻塞状态
        BLOCKED,

        // 等待状态
        WAITING,

        // 超时等待
        TIMED_WAITING,

        // 终止
        TERMINATED;
    }

wait/sleep的区别

1、来自不同的类
wait -> Object
sleep -> Thread
2、关于锁的释放
wait会释放锁
sleep不会释放锁
3、使用的范围
wait必须在同步代码块中
sleep可以在任意地方休眠

3、Lock锁(重点)

synchronized

synchronized互斥锁(非公平锁),使用方式

// 同步代码块方式
//1、同步非静态锁,可以是this,也可以是其他的对象,但要求是同一个对象
//2、同步静态锁为当前类本身,即类.class
synchronized (对象){
    同步操作;
}

// 同步方法
public synchronized void method(){
    同步操作;
}

以卖票为例

public class SaleTicketDemo01 {
    public static void main(String[] args) {
        // 并发编程,多个线程操作同一个资源类,将资源类丢入到线程中
        Mac mac = new Mac();

        // @FunctionalInterface 函数式接口,在jdk1.8中使用了Lambda表达式(参数)->{代码}
        new Thread(()->{
            for (int i = 0; i < 60; i++) {
                mac.sale();
            }
        },"A").start();
        new Thread(()->{
            for (int i = 0; i < 60; i++) {
                mac.sale();
            }
        },"B").start();
        new Thread(()->{
            for (int i = 0; i < 60; i++) {
                mac.sale();
            }
        },"C").start();
    }
}

// 资源类 OOP
class Mac{
    // 类中只包含属性、方法
    private int num = 50;

    //卖票的方式
    void sale(){
        // synchronized 本质就是一个非公平锁
        synchronized (this){
            if(num > 0) {
                System.out.println(Thread.currentThread().getName() + "卖出了:" + (num--) + ",剩余" + num);
            }
        }
    }
}

Learning

标签:JUC,Thread,synchronized,void,线程,sleep,public
From: https://www.cnblogs.com/porterdong/p/16953218.html

相关文章

  • JUC并发编程
    什么是JUCJDK1.5出现的,用来处理线程的工具包进程与线程进程:指在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程一-资源分配的最小单位。线程:系统分配处理器时......
  • JUC高级篇-第2章 多线程锁
    1.乐观锁与悲观锁悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。适合写操作多的场景,先加锁可以保......
  • JUC面试点汇总
    JUC面试点汇总我们会在这里介绍我所涉及到的JUC相关的面试点内容,本篇内容持续更新我们会介绍下述JUC的相关面试点:线程状态线程池Wait和SleepSynchronized和LockVol......
  • 【JUC】交换器Exchanger详解
    欢迎关注专栏【JAVA并发】前言JDK中提供了不少的同步工具,现在分享一个相对比较冷门的同步工具——交换器(Exchanger)。你知道Exchanger的作用是什么吗?实现机制是什么?可以......
  • 【JUC】循环屏障CyclicBarrier详解
    欢迎关注专栏【JAVA并发】前言jdk中提供了许多的并发工具类,大家可能比较熟悉的有CountDownLatch,主要用来阻塞一个线程运行,直到其他线程运行完毕。而jdk还有一个功能类......
  • JUC源码学习笔记6——ReentrantReadWriteLock
    系列文章目录和关于我阅读此文需要有AQS独占和AQS共享的源码功底,推荐阅读:1.JUC源码学习笔记1——AQS独占模式和ReentrantLock2.JUC源码学习笔记2——AQS共享和Semaphore......
  • 【JUC】信号量Semaphore详解
    欢迎关注专栏【JAVA并发】欢迎关注个人公众号——JAVA旭阳前言大家应该都用过synchronized关键字加锁,用来保证某个时刻只允许一个线程运行。那么如果控制某个时刻允......
  • JUC
    JUC概述JUC简介在Java中,线程部分是一个重点,本篇文章说的JUC也是关于线程的。JUC就是java.util.concurrent工具包的简称。这是一个处理线程的包,JDK1.5开始出现的。进程......
  • JUC并发编程
    线程和进程进程:一个程序一个进程往往可以包含多个线程,至少包含一个线程:对于java而言:Thread,Runnable,Callablejava不可以开启线程并发(多个线程操作同一个资源)CPU一......
  • JUC并发编程(2)
    cpu密集型:几核就设置几,可以保持cpu的效率最高io密集型:设置大于判断你程序中十分耗io资源的线程ForkJoin:分而治之和工作窃取算法Future:异步回调:比如我i请求阻塞线程两秒......