美文网首页
对Java线程安全与不安全的理解

对Java线程安全与不安全的理解

作者: kindol | 来源:发表于2018-07-30 23:57 被阅读0次

一个线程不安全的类

public class Count {  
    private int num;  
    public void count() {  
        for(int i = 1; i <= 10; i++) {  
            num += i;  
        }  
        System.out.println(Thread.currentThread().getName() + "-" + num);  
    }  
}  

正常的理解,调用count()应该会输出55

在主函数中启动10个线程:

public class ThreadTest {  
    public static void main(String[] args) {  
        Runnable runnable = new Runnable() {  
            Count count = new Count();  
            public void run() {  
                count.count();  
            }  
        };  

        for(int i = 0; i < 10; i++) {  
            new Thread(runnable).start();  
        }  
    }  
}  

输出结果如下:

Thread-0-55  
Thread-1-110  
Thread-2-165  
Thread-4-220  
Thread-5-275  
Thread-6-330  
Thread-3-385  
Thread-7-440  
Thread-8-495  
Thread-9-550

只有Thread-0线程输出的结果是我们期望的,其他的跟想象中的不符,为何?

每个线程都有自己的工作内存(线程栈),工作内存存储了主内存count对象的一个副本,当线程操作count对象时,首先从主内存复制count对象到工作内存中,然后执行代码count.count(),改变了num值,最后用工作内存中的count刷新主内存的 count

可以看出,多个线程对同一个实例类的同一个变量操作是不安全的,不安全体现在这个成员变量可能发生非原子性的操作,然而,变量定义在方法内(局部变量)、多个线程访问同一个对象中的同步方法是安全的

java线程的两个特性:可见性(也就是工作内存会刷新主内存)、有序性(结果取决于线程调度的精准时序)

相关文章

  • 线程不安全?

    1、什么是线程不安全? 线程安全是java学习中的重点,了解哪些情况下线程不安全,可让初学者更好的理解 线...

  • 对Java线程安全与不安全的理解

    一个线程不安全的类 正常的理解,调用count()应该会输出55在主函数中启动10个线程: 输出结果如下: 只有T...

  • kotlin 单利模式

    1. 懒汉式 java线程不安全 缺点是在多线程不能正常工作 线程安全 效率比较低 kotlin线程不安全 线程...

  • 计数器

    讲讲Java里计数器问题,对于理解原子性很有帮助。 线程安全的计数器 与 线程不安全的计数器 直接上代码,代码里实...

  • java_多线程

    java_多线程 线程创建方式;join用法; sleep和wait区别; 线程安全和不安全的java集合; St...

  • ConcurrentHashMap

    总结 HashMap在多线程中不安全,java提供了线程安全的ConcurrentHashMap 类,保证在多线程...

  • 并发编程学习

    JAVA同步类容器线程是否安全以及介绍: 1,ArrayList,LinkedList线程不安全Vector 对应...

  • atomic和线程安全的理解

    atomic和线程安全的理解 线程安全 如果多线程下,一直操作i = i + 1,可能出现线程不安全 i = i ...

  • 字符串(2)-StringBuffer与StringBuilde

    1.StringBuffer1)StringBuffer:线程不安全,也是对字符串的操作,位于java.lang包...

  • 关于Java中的 CopyOnWriteArraySet

    最近做的课程设计中用到了Java线程安全的集合类,因此关于对Java线程安全集合类的理解做个简单记录。Java集合...

网友评论

      本文标题:对Java线程安全与不安全的理解

      本文链接:https://www.haomeiwen.com/subject/ucaqvftx.html