![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
文章平均质量分 58
并发编程
Mdy1140370434
这个作者很懒,什么都没留下…
展开
-
volatile关键字
volatile具备可见性、有序性,不具备原子性,并不能保证线程安全,但常与CAS结合,形成一种高性能的无锁。Java内存模型JMM,它规定所有变量都存储在主内存,每个线程都有自己的工作内存,其中保存了主内存变量的副本。当变量被volatile修饰,变量发生修改时,值会立即被更新到主存,其他线程可以及时在内存中读取到最新值。并发编程有三要素:原子性、可见性、有序性。原创 2024-08-10 16:31:25 · 65 阅读 · 0 评论 -
并发编程的核心问题
由于想让程序响应处理速度更快,Java内存模型设计有主内存和工作内存(线程使用的内存),线程不能直接对主内存中的数据进行操作,必须将主内存数据加载到工作内存(本地内存),这样在多核CPU下就会产生不可见性,我们的目标就是要做到可见性。可以解决不可见性,volatile修饰的变量在一个线程修改后,其他线程立即可见。还可以解决乱序性,volatile修饰的变量在执行时禁止指令重排序,但不能解决非原子性问题。乱序性:指令在执行的过程中,为了优化,一些指令的顺序会发生改变,这种改变可能会影响程序的整个运行结果。原创 2024-08-10 16:24:48 · 99 阅读 · 0 评论 -
Java 线程
synchronized修饰方法时,要注意方法是静态还是非静态,静态方法的锁对象是该类的Class对象,而非静态方法的锁对象默认是this。线程(thread)是一个进程内部的最小执行单元(具体要做的一件事),是操作系统进行任务调度的最小单元,隶属于进程,进程可进一步细化为线程。(3)调用wait()方法会释放当前线程持有的锁,使得其他等待线程可以获取到该锁,而调用sleep()方法则不会释放锁。因此,在使用多线程编程时,需要仔细评估和权衡其优点和缺点,选择适当的场景和设计方案,确保程序的正确性和性能。原创 2023-07-02 23:10:14 · 52 阅读 · 1 评论 -
ThreadLocal及其内存泄漏问题
ThreadLocal 本身不存储数据,当调用ThreadLocal 的 set 方法时,ThreadLocal 会将自身的引用 this 作用为 key,将用户传入的值作为 value,存到线程的 ThreadLocalMap 中,这就相当于每个线程的读写操作都基于其本身的私有副本,而线程之间的数据是相互隔离的。:只要强引用关系(指代码中普遍存在的赋值关系)还在,对象就永远不会被回收(男主角,有主角光环,怎么都死不了);:等同于没有引用,回收会收到一个系统通知(路人甲)。原创 2024-01-21 20:11:48 · 368 阅读 · 0 评论