Java线程安全?
Java里的线程安全多个线程同时访问同一份数据时程序仍能得到正确且符合预期的结果不会因为线程切换导致数据错乱。它主要涉及三个问题原子性可见性有序性。原子性一个操作要么全做完要么不做比如count其实不是原子操作。可见性一个线程修改了可见变量其它线程能不能马上看到。有序性代码执行可能会发生指令重排序单线程没问题多线程下可能会出错。常见解决方案有用synchronized或Lock保证原子性和可见性用volatile保证可见性和一定的有序性但不能保证复合操作的原子性用AtomicInteger这类原子类尽量通过ThreadLocal、不可变对象、减少共享数据来从设计上避免线程安全问题。比如HashMap线程不安全ConcurrentHashMap。更适合并发场景。本质上线程安全就是正确地管理 共享数据 和 并发访问。1. 线程安全的核心是什么核心就是一句话多个线程共享资源时既要保证数据的正确性又要保证能可接受。2. 三大特性怎么理解原子性操作不能被打断可见性一个线程改了值别的线程立马能看到有序性程序的执行顺序不能因为重排序影响结果。3.volatile和synchronized区别volatile保证可见性、禁止部分重排序适合状态标记这类场景synchronized既能保证原子性又能保证可见性但开销通常更大像count这种复合操作volatile不够得用synchronized、Lock或原子类。一句话总结volatile轻量但能力有限synchronized更全面。4. 面试里举个例子class Counter { private int count 0; public synchronized void increment() { count; } public synchronized int getCount() { return count; } }解释时说如果多个线程同时对count做会出现竞态条件所以需要加锁保证线程安全。更像“背诵稿”的版本Java 线程安全是指多个线程并发访问共享资源时程序仍然能保持正确性。它主要解决三个问题原子性、可见性和有序性。原子性指操作不能被线程切换打断可见性指一个线程修改共享变量后其他线程能及时看到有序性指防止指令重排导致并发问题。常见解决方案synchronized、Lock、volatile、CAS 和原子类以及通过 ThreadLocal、不可变对象减少共享。比如 count 不是原子操作HashMap 也不是线程安全的而 ConcurrentHashMap 更适合并发场景。超短版回答Java 线程安全就是多个线程同时访问共享数据时结果仍然正确。核心是解决原子性、可见性和有序性问题。常见做法有 synchronized、Lock、volatile、CAS 和原子类另外也可以通过不可变对象、ThreadLocal 来减少共享从设计上避免并发问题。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2441413.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!