当前位置: 首页 > news >正文

Java 面试总结

1. Java 并发volatile 问题代码

class NumberDemo {
//private AtomicInteger count = new AtomicInteger(0);
    private volatile int count = 0;

    public void add() {
        this.count++;
    }

    public int getCount() {
        return this.count;
    }
}

public class ThreadDemo {
    public static void main(String[] args) {
        NumberDemo d = new NumberDemo();
        //CountDownLatch latch = new CountDownLatch(10);
        for (int i = 1; i <= 10; i++) {
        new Thread(()-> {
              for (int j = 1; j <= 100; j++) {
                    d.add();
              }
        }).start();
    }
    if (Thread.activeCount() > 1) {
        Thread.yield();
    }
    System.out.println("count is :" + d.getCount());
}

 1. 问题这个count 虽然添加了volatile ,但是count++ 不是原子的.

2.主线程在启动所有子线程后,通过检查 Thread.activeCount() > 1 并调用 Thread.yield() 尝试等待子线程完成。这种方式‌不可靠‌,因为:

  • Thread.activeCount() 返回的线程数包含主线程自身,判断逻辑不准确。
  • Thread.yield() 仅让出当前线程的 CPU 时间片,但无法确保所有子线程执行完毕。

主线程可能‌提前输出结果‌,而子线程尚未完成所有累加操作,导致输出值远小于 1000, 其实个人答错这道题是因为忘记volatile 只能保证可见性,无法保证原子性,还有就是这个yield我从来没有用过。

class NumberDemo {
    //private AtomicInteger count = new AtomicInteger(0);
    private volatile int count = 0;

    public synchronized void add() {
        this.count++;
    }

    public int getCount() {
        return this.count;
    }
}

public class ThreadDemo {
    public static void main(String[] args) throws InterruptedException {
        NumberDemo d = new NumberDemo();
        Thread [] threads = new Thread[10];
        //CountDownLatch latch = new CountDownLatch(10);
        for (int i = 0; i < 10; i++) {
            threads[i] = new Thread(()-> {
                for (int j = 1; j <= 100; j++) {
                    d.add();
                }
            });
            threads[i].start();
        }
        for(Thread t: threads){
            t.join();
        }
        System.out.println("count is :" + d.getCount());

    }
}

2. 现成的run 问题

       Thread t  = new Thread(new Runnable() {
            @Override
            p
http://www.dtcms.com/a/123319.html

相关文章:

  • 数据结构 | 证明链表环结构是否存在
  • ubuntu设备磁盘空间不足 处理办法
  • WinForm真入门(12)——RadioButton控件详解
  • C++中static与private继承关系解析
  • Soybean Admin 使用tv-focusable兼容电视TV端支持遥控器移动焦点
  • 智能体代理模式(Agent Agentic Patterns)深度解析
  • C盘清理技巧分享
  • 期权与期货的在险价值
  • SmolDocling:一种超紧凑的视觉语言模型,用于端到端多模态文档转换
  • SpringBoot接口覆盖上一次调用的实现方案
  • kafka生产者partition数量和消费者数量的关系
  • APIGen-MT:高效生成多轮人机交互Agent数据的两阶段框架
  • VCode 的 .S 汇编文件里面的注释不显示绿色
  • [数据结构]排序
  • 深度剖析丝杆升降机的蜗杆精度要求等级​
  • 【Pandas】pandas DataFrame to_numpy
  • 微店商品属性参数接口
  • 百度地图小区边界爬取
  • 从PPT到PNG:Python实现的高效PPT转图工具
  • Edge浏览器IE兼容模式设置
  • JavaScript(JS进阶)
  • 【AI论文】OmniSVG:一种统一的(可扩展)矢量图形生成模型
  • STM32单片机入门学习——第31节: [10-1] I2C通信协议
  • 需求开发与需求管理的全景解析
  • 4.10学习总结
  • MQTT:基于Keil开发工具移植入MQTTClient-C开源库
  • JS—同源策略:2分钟掌握同源策略
  • vue2添加背景水印-手动实现(无组件模式)
  • 4月10(信息差)
  • linux系统下如何提交git和调试