之前未曾接触过多线程编程 公司的项目开始用到多线程,所以自己谈谈个人对于并发编程的见解。
并发编程会导致线程不安全,常说的线程不安全指的是 多个线程操作一个共享数据,导致线程之间的读取到的数据不一致。
并发编程导致线程不安全的根源 可见性 原子性 有序性
1 .可见性 cpu缓存导致。 一般cpu缓存中进行操作之后再将数据写到内存,在多核服务器中 每个线程都会分配一个cpu 都会在各自的cpu中进行处理再将数据统一写到内存中。每个cpu缓存中的数据都是不可见的。导致最红写入内存,然后再从内存中读出来时候数据不一致。
2 原子性 在java语句中一行语句在服务器内部进行了多次操作。比如创建一个对象,new 在在堆中开辟一块空间 最后将地址赋予这个对象 如果在期间发生那个线程的切换 就可能会报错
3有序性 编译优化产生。指的是 在代码在JVM上执行的时候都会进行一定的编译优化,在优化之后 可能在创建对象的时候 先是将地址指向了对象然后再分配的内存空间
要解决这些问题,理论上禁用缓存和编译优化就可以了,对于原子性 使用volidate 关键字和 happen-before 规则就可以避免了。但是我们需要考虑到性能。(有时间再补充)
学过计算机的,都知道,实际上所有的并发问题都可以用信号量来解决。这个信号量实际上和管程是一样的 ,都能用来处理并发问题。
管程是一种模型,是一把解决并发的万能钥匙,Java中的
原文地址:https://www.cnblogs.com/mrxiab/p/10676116.html
时间: 2024-10-07 05:08:49