并发(二)

共享资源问题

多个线程访问同一个资源时,其顺序不能保证,可能会造成错误。可以用sycronized关键字锁住某个对象,保证其访问是异步的。

另一个方案是用lock。

区别:

sycronized是悲观锁,阻塞等待,lock可以搞乐观锁,尝试冲突重试

sycronized死等抱柱信,lock可以设置响应中断

sycronized控制临界资源与await和notify管理有序对应的对象是同一个,lock用newCondition的方式实现了分离,控制更精确。

原子性,可见性,有序性。

volatile保证可见性,通过禁用指令重排保证有序性,但不保证原子性。

syncronized和lock以及AtomicXXX可以保证原子性。

时间: 2024-08-10 23:29:19

并发(二)的相关文章

Android 并发二三事之 Handler 机制的妙用 HandlerThread

Android 并发第五篇 本篇会讲解如何利用 HandlerThread 实现异步操作. HandlerThread 本身其实就是一个 Thread ,但是其内部还利用 Handler 机制. 对于提交的任务(或者说是信息 Message)依次处理. 所以在介绍 HandlerThread 原理以及如果使用之前,会首先说一个 Handler 异步机制. 当然 Handler, Looper, Message 之间的关系相信很多人都已经很熟悉了,这里会只着重介绍和本节相关的内容. 一 .Hand

多线程与高并发(二)线程安全

上一篇学习了多线程的一些基础知识:多线程的基本概念,及创建和操作多线程.内容相对简单,但多线程的知识肯定不会这么简单,否则我们也不需要花这么多心思去学习,因为多线程中容易出现线程安全问题. 那么什么是线程安全呢,定义如下: 当多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替运行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获取正确的结果,那这个对象是线程安全的. 简单的理解就是在多线程情况下代码的运行结果与预期的正确结果不一致,而产

面包屑之java并发二

最近一直在看<java并发编程实践>. 很大收获谈不上,至少见识到了并发世界的广博. 以前对java并发的概念是少之又少,感觉只需要用好synchronized关键字就好. 如今回想,实乃现实版的井中之蛙,狭隘至极. 书大概看完了,梳理下看到的一些点. 关键字 线程安全: 存在线程共享可变对象,则需要考虑线程安全.线程安全的定义:在多线程环境中,能永远保证程序的正确性. 原子性: 在这指的是基于线程的原子性.原子性操作:只能由一个线程单独访问的操作.即在执行该操作时,要么执行完,要么不执行,不

深入浅出GCD----底层并发(二)

迭代执行: 如果你正在倒弄一些数字,并且手头上的问题可以拆分出同样性质的部分,那么 dispatch_apply 会很有用. 如果你的代码看起来是这样的: for (size_t y = 0; y < height; ++y) { for (size_t x = 0; x < width; ++x) { // Do something with x and y here } } 对它做个小改动,让它运行的更快: dispatch_apply(height, dispatch_get_globa

Java并发(二)

并发编程的第二部分,先来谈谈发布(Publish)与逸出(Escape); 发布是指:对象能够在当前作用域之外的代码中使用,例如:将对象的引用传递到其他类的方法中,对象的引用保存在其他类可以访问的地方,或在某个非私有的方法中返回对象的引用; 逸出是指:发布内部状态可能会破坏封装性,如果在对象构造完成之前就发布该对象,就会破坏线程安全性; 下面结合一个例子来理解: class UnsafeStates { private String[] states = new String[] { "AA&q

深入理解并发(二)--生产者及消费者

生产者及消费者问题,是线程操作中的一个经典案列.但由于线程运行的不确定性,生产者及消费者可能会产生一些问题: 试想,如果生产者线程向存储数据空间添加了部分信息,但没有添加全部,这时就切换到消费者线程,这时消费者线程将会把已经添加了的部分信息,后上一次的信息混淆了,导致出错. 或者,若生产者放数据,与消费者取数据的速度不匹配,也会出现问题:即可能会出现,生产者放了多条数据,消费者才取了一条,导致数据丢失:或生产者只放了一条数据,但消费者已经取了多条,这会导致重复取出数据. 举例说明: class

【好程序员训练营】-Java多线程与并发(二)之线程同步

android培训--我的java笔记,期待与您交流! 线程同步 1 . 多线程共享数据 在多线程操作中, 多个线程有可能同时处理同一个资源, 这就是多线程中的共享数据. 举个不太恰当的例子简单理解一下,图中是小新家的厕所茅坑,但是家里只有一个那这就是一个"资源",那么家里的所有人都共享这同一个"资源",也就是所谓的多线程共享数据 可以明显的看出多线程共享数据带来的问题,就是会造成数据的不确定性!就好比小新正在上着厕所,此时小新爸爸来了, 此时相当于一个资源两个人在

java 关于多线程高并发方面

转有关的文章链接: Java 高并发一:前言: http://www.jb51.net/article/92358.htm Java 高并发二:多线程基础详细介绍 http://www.jb51.net/article/92360.htm Java 高并发三:Java内存模型和线程安全详解 http://www.jb51.net/article/92361.htm Java 高并发四:无锁详细介绍 http://www.jb51.net/article/92362.htm Java 高并发五:J

操作系统-并发-线程-进程

操作系统/应用程序 什么是操作系统? 精简的说法:操作系统就是一个人协调,管理和控制计算机硬件资源和软件资源的控制程序 操作系统位于计算机硬件与应用软件之间,本质也是一个软件.操作系统由操作系统的内核(运行于内核态,管理硬件资源)以及系统 调用(运行于用户态,为应用程序员写的应用程序提供系统调用接口)两部分组成,所以,单纯的说操作系统是运行于内核态的,是不准确的. 日常我们所知道的操作系统/应用程序: 硬件: -硬盘 -CPU -主板 -显卡 -内存 -电源 -...... 软件(装系统): -

nginx 多进程 + io多路复用 实现高并发

一.nginx 高并发原理 简单介绍:nginx 采用的是多进程(单线程) + io多路复用(epoll)模型 实现高并发 二.nginx 多进程 启动nginx 解析初始化配置文件后会 创建(fork)一个master进程 之后 这个进程会退出 master 进程会 变为孤儿进程 由init进程托管.(可以通过python 或php 启动后创建子进程,然后杀死父进程得见子进程会由init进程托管) 如下图可以看到nginx master 进程由init(ppid 为1 )进程管理. maste