(更新中)谈谈个人对java并发编程中(管程模型,死锁,线程生命周期等问题) 见解
Posted 码宝宝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(更新中)谈谈个人对java并发编程中(管程模型,死锁,线程生命周期等问题) 见解相关的知识,希望对你有一定的参考价值。
之前未曾接触过多线程编程 公司的项目开始用到多线程,所以自己谈谈个人对于并发编程的见解。
并发编程会导致线程不安全,常说的线程不安全指的是 多个线程操作一个共享数据,导致线程之间的读取到的数据不一致。
并发编程导致线程不安全的根源 可见性 原子性 有序性
1 .可见性 cpu缓存导致。 一般cpu缓存中进行操作之后再将数据写到内存,在多核服务器中 每个线程都会分配一个cpu 都会在各自的cpu中进行处理再将数据统一写到内存中。每个cpu缓存中的数据都是不可见的。导致最红写入内存,然后再从内存中读出来时候数据不一致。
2 原子性 在java语句中一行语句在服务器内部进行了多次操作。比如创建一个对象,new 在在堆中开辟一块空间 最后将地址赋予这个对象 如果在期间发生那个线程的切换 就可能会报错
3有序性 编译优化产生。指的是 在代码在JVM上执行的时候都会进行一定的编译优化,在优化之后 可能在创建对象的时候 先是将地址指向了对象然后再分配的内存空间
要解决这些问题,理论上禁用缓存和编译优化就可以了,对于原子性 使用volidate 关键字和 happen-before 规则就可以避免了。但是我们需要考虑到性能。(有时间再补充)
学过计算机的,都知道,实际上所有的并发问题都可以用信号量来解决。这个信号量实际上和管程是一样的 ,都能用来处理并发问题。
管程是一种模型,是一把解决并发的万能钥匙,Java中的
以上是关于(更新中)谈谈个人对java并发编程中(管程模型,死锁,线程生命周期等问题) 见解的主要内容,如果未能解决你的问题,请参考以下文章
java并发编程:管程内存模型无锁并发线程池AQS原理与锁线程安全集合类并发设计模式
Day833.Lock和Condition(上):隐藏在并发包中的管程 -Java 并发编程实战