常见的基础概念

虚假唤醒

介绍:

一个线程可以从挂起状态变为可运行状态(也就是被唤醒),即使该线程没有被其他线程调用notify()、notifyall()方法进行通知,或者被中断,或者等待超时;

解决:

不停的去测试该线程是否满足条件,不满足则继续等待;
synchronized(obj){
    while(条件不满足){
        obj.wait();
    }
}

join与yield的异同

join

  • 一个线程在运行的过程中,临时加入另外一个线程,等待新加入的线程运算完之后,旧的线程再继续执行;
  • 旧的线程处理阻塞状态;

源码:

public final synchronized void join(long millis)
    throws InterruptedException {
        long base = System.currentTimeMillis();
        long now = 0;

        if (millis < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (millis == 0) {
            while (isAlive()) {
                //等待
                wait(0);
            }
        } else {
            while (isAlive()) {
                long delay = millis - now;
                if (delay <= 0) {
                    break;
                }
                wait(delay);
                now = System.currentTimeMillis() - base;
            }
        }
    }

实例:加入的线程全部执行完毕之后,旧的线程才继续执行;

/**
 * @author SHshuo
 * @data 2021/9/4--20:22
 * join的概念:
 * 当我们在进行多线程运算的时候,一个线程在运行的过程中。
 * 我们可以临时加入另外一个线程,让新加入的线程运算完之后,旧的线程再继续执行。旧的线程处于阻塞状态。
 */
public class joinTest {
    public static void main(String[] args) throws InterruptedException {

        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 20; i++) {
                System.out.println(Thread.currentThread().getName() + "=>" + i);
            }
        },"A");

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 20; i++) {
                System.out.println(Thread.currentThread().getName() + "=>" + i);
            }
        },"B");

        thread1.start();
//        正常是A、B交替执行,加入join相当于插入A,会等到A全部执行完毕,B才执行
        thread1.join();
        thread2.start();
    }
}


yield

  • 可以将当前线程的执行权限让出来:Running(运行) -> Runnable(就绪)。只是礼让一下,仍有可能交替执行;
  • 就绪状态:是指该线程已经获得了除了CPU资源外的其他资源,等到获取CPU资源后才会真正处于运行状态;

源码:

public static native void yield();

实例:新加入的线程与旧的线程交替执行

/**
 * @author SHshuo
 * @data 2021/9/4--20:22
 * yield概念: 可以将当前的线程的执行权限让出来,Running(运行) -> Runnable(就绪)。
 * 只是礼让一下,仍有可能交替执行。
 */
public class yieldTest {
    public static void main(String[] args) {
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 20; i++) {
                System.out.println(Thread.currentThread().getName() + "=>" + i);
//                A线程会礼让B线程一下,A处于就绪状态之后又与B线程交替执行
                Thread.yield();
            }
        },"A");

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 20; i++) {
                System.out.println(Thread.currentThread().getName() + "=>" + i);
            }
        },"B");

        thread1.start();
        thread2.start();
    }
}

伪共享

涉及OS的内容具体查看本博客的链接:
https://blog.nowcoder.net/n/f6c3f2facf2b41f6989fd93580db7294




hshuo的面试之路 文章被收录于专栏

作者目标是找到一份Java后端方向的工作 此专栏用来记录从Bilibili、书本、其他优质博客上面学习的内容 用于巩固、总结内容 主要包含Docker、Dubbo、Java基础、JUC、Maven、MySQL、Redis、SpringBoot、SpringCloud、数据结构、杂文、算法、计算机网络、操作系统、设计模式等相关内容

全部评论

相关推荐

沉淀去了,8月是不是机会会多一点,。打招呼300+,就一个小厂面试,聊了十分钟天就让我去了,暑假继续沉淀了,到八月九月冲了
丰川打工祥:我目前的体感是,双非本+一段小厂实习,基本约不到中厂的面。已经开始第二段小厂了。可能的确是最近hc太少了。
点赞 评论 收藏
分享
Yki_:你要算时间成本呀,研究生两三年,博士三四年,加起来就五六年了,如果你本科去腾讯干五年,多领五年的年薪,加上公司内涨薪,可能到时候十五年总薪资也跟博士差不多
点赞 评论 收藏
分享
头顶尖尖的程序员:我也是面了三四次才放平心态的。准备好自我介绍,不一定要背熟,可以记事本写下来读。全程控制语速,所有问题都先思考几秒,不要急着答,不要打断面试官说话。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务