(更新中)谈谈个人对java并发编程中(管程模型,死锁,线程生命周期等问题) 见解

之前未曾接触过多线程编程  公司的项目开始用到多线程,所以自己谈谈个人对于并发编程的见解。

并发编程会导致线程不安全,常说的线程不安全指的是  多个线程操作一个共享数据,导致线程之间的读取到的数据不一致。

并发编程导致线程不安全的根源   可见性  原子性    有序性

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

(更新中)谈谈个人对java并发编程中(管程模型,死锁,线程生命周期等问题) 见解的相关文章

java并发编程中CountDownLatch和CyclicBarrier的使用

转自:http://blog.csdn.net/hbzyaxiu520/article/details/6183714 在多线程程序设计中,经常会遇到一个线程等待一个或多个线程的场景,遇到这样的场景应该如何解决? 如果是一个线程等待一个线程,则可以通过await()和notify()来实现: 如果是一个线程等待多个线程,则就可以使用CountDownLatch和CyclicBarrier来实现比较好的控制. 下面来详细描述下CountDownLatch的应用场景: 例如:百米赛跑:8名运动员同时

Java并发编程学习笔记(一)线程安全性 1

什么是线程安全性: 要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的和可变的状态的访问."共享"意味着变量可以由多个线程同时访问,而"可变"则意味着变量的值在其生命周期内可以发生变化. 一个对象是否需要线程安全的,取决于他是否被多个线程访问.这指的是在程序中访问对象的方式,而不是对象要实现的功能.要使得对象时线程安全的,需要采用同步机制来协同对对象可变状态的访问.如果无法实现协同,那么可能导致数据破坏以及其他不该出现的结果. 如果当多个线程访

java并发编程中常用的工具类 Executor

/***************************************************  * TODO: description .  * @author: gao_chun  * @since:  2015-4-17  * @version: 1.0.0  * @remark: 转载请注明出处  **************************************************/ java.util.concurrent.Executor 使用 Execut

java并发系列(一)-----多线程简介、创建以及生命周期

进程.线程与任务进程:程序的运行实例.打开电脑的任务管理器,如下: 正在运行的360浏览器就是一个进程.运行一个java程序的实质是启动一个java虚拟机进程,也就是说一个运行的java程序就是一个java虚拟机进程.进程是程序向操作系统申请资源(如内存空间和文件句柄)的基本单位. 线程:是进程中可独立执行的最小单位,并且不拥有资源.进程相当于工厂老板,整个工厂的机器都是属于老板的,但是工厂里面的活都是由工人完成的. 任务:线程所要完成的计算就被称为任务,特定的线程总是执行特定的任务. java

Java并发编程中线程池源码分析及使用

当Java处理高并发的时候,线程数量特别的多的时候,而且每个线程都是执行很短的时间就结束了,频繁创建线程和销毁线程需要占用很多系统的资源和时间,会降低系统的工作效率. 参考http://www.cnblogs.com/dolphin0520/p/3932921.html 由于原文作者使用的API 是1.6 版本的,参考他的文章,做了一些修改成 jdk 1.8版本的方法,涉及到的内容比较多,可能有少许错误. API : jdk1.8.0_144 ThreadPoolExecutor类 Java中线

java并发编程中的ReentrantLock(一)

package com.wangan.logistic; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class WanganReentrantLockService { private Lock lock = new ReentrantLock(); priv

Java并发编程学习笔记(一)——线程安全性

1.当多个线程访问某个状态变量并且其中有一个献策灰姑娘执行写入操作时,必须采用同步机制来协同这些线程对变量的访问.Java中的主要同步机制是关键字synchronized,他提供了一种独占的加锁方式. 2.在任何情况下,只有当类中仅包含自己的状态时,线程安全类才是有意义的. 3.当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些献策灰姑娘讲如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 4.无状态对象一定是线程安全的

Java 并发编程(一)浅谈线程安全

首先我们要弄清楚什么叫线程安全. "线程安全"是指:当多个线程访问某个类时,不管运行环境采用何种调度方式或者这些线程如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 这里有三个关键点, 第一."线程安全"问题是来源于多个线程访问的情况下,当个线程没有竞争便涉及到出现线程安全的问题. 第二.类的"线程安全"性不依赖于多线程的执行顺序. 第三.主调代码不需要同步或协同.某个类"

Java并发编程笔记4-线程池

我们使用线程的时候就去创建一个线程,但是就会有一个问题: 如果并发的线程数量非常多,而且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会导致大大降低系统的效率,因为频繁创建线程和销毁线程需要时间. 那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务? 线程池正好能解决这样的问题.正如名称所称的那样,线程池管理一个工作者线程的同构池.线程池是与工作队列紧密绑定的.所谓工作队列,其作用是持有所有等待执行的任务. 工作者线程的生活从此轻松起来