这段代码线程安全吗?能说下为什么吗?

广寒月蛮兔 2020-01-09 11:06:43
如果我想同一时间内只有一个线程执行test方法里面的代码

static boolean b = true;

public static void task() {
if (b) {
b = false;
System.out.println(Thread.currentThread().getName() + "执行了task");

}
}
...全文
262 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hon-zb 2020-01-17
  • 打赏
  • 举报
回复
不安全 volatile
亦夜 2020-01-10
  • 打赏
  • 举报
回复
不安全,但是我会建议你先看段代码,再建议你把volatile看一下,JMM看一下你就知道这段代码为什么不安全了
    public static void main(String[] args) {
        Test test = new Test();
        for (int i = 0; i < 10; i++) {
            new Thread(()-> {
                for (int j = 0; j < 10; j++) {
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    test.task();
                }
            },"A"+i).start();
        }

        while (Thread.activeCount() > 2){
            Thread.yield();
        }
        System.out.println(Thread.currentThread().getName()+"方法执行次数"+test.get());
    }
}

class Test{
    static volatile boolean b = true;
    AtomicInteger atomicInteger = new AtomicInteger();

    public void task() {
        add();
        //System.out.println(Thread.currentThread().getName()+"\t 进入方法...");
        if (b) {
            b = false;
            System.out.println(Thread.currentThread().getName() + "修改了值");
        }
    }

    public void add(){
        atomicInteger.getAndIncrement();
    }

    public int get(){
        return atomicInteger.get();
    }
maradona1984 2020-01-10
  • 打赏
  • 举报
回复
不安全. 我也建议看书,多线程这东西你得稍微深入一点才能理解. 直接同步关键字就能搞定的事情何必这么麻烦,如果你想用这种方式实现线程安全,可以参考CAS自旋锁
小包包007 2020-01-10
  • 打赏
  • 举报
回复
首先不安全,而且问题太基础,没啥说的
小包包007 2020-01-10
  • 打赏
  • 举报
回复
建议自己看书

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧