同步

Objective-C的【同步机制】

試著忘記壹切 提交于 2019-12-05 15:35:31
1.同步块@synchronization(obj)--因为同一个锁的同步块必须按顺序执行,所以滥用会降低代码效率;如果频繁加锁, 2.NSLock或NSRecursiveLock(递归锁)--极端情况下也会出现死锁。 3.GCD--串行同步队列/并发队列 详细代码:https://github.com/shengguoqiang/GCD.git 来源: oschina 链接: https://my.oschina.net/u/2692065/blog/651204

深入研究Servlet线程安全性问题

旧时模样 提交于 2019-12-05 04:14:06
Servlet/JSP技术和ASP、 PHP 等相比,由于其多线程运行而具有很高的执行效率。由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的安全性问题。然而,很多人编写Servlet/JSP程序时并没有注意到多线程安全性的问题,这往往造成编写的程序在少量用户访问时没有任何问题,而在并发用户上升到一定值时,就会经常出现一些莫明其妙的问题。 Servlet的多线程机制 Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,也就是有多个线程在使用这个实例。Servlet容器会自动使用线程池等技术来支持系统的运行. 这样,当两个或多个线程同时访问同一个Servlet时,可能会发生多个线程同时访问同一资源的情况,数据可能会变得不一致。所以在用Servlet构建的Web 应用 时如果不注意线程安全的问题,会使所写的Servlet程序有难以发现的错误。 Servlet的线程安全问题 Servlet的线程安全问题主要是由于实例变量使用不当而引起的,这里以一个现实的例子来说明。 Import javax.servlet. *;

NIO与JDBC的再思考:同步与阻塞在论域上的根本区别

风格不统一 提交于 2019-12-04 19:03:43
JDBC中STATEMENT的执行是同步的。但是非阻塞的。即,不同的STATEMENT间并不会互相阻塞。这一点与NIO是相似的。 同步的论域是纵向的。它表达的是模块间的协作模型。 阻塞的论域是横向的。它表达的是线程间的协作模型。维基上的解释也是这样的:http://en.wikipedia.org/wiki/Non-blocking_algorithm: ...The traditional approach to multi-threaded programming is to use locks to synchronize access to shared resources... 两者的语义都是动态的。模块协作与线程协作都是运行时语义。分别用来描述程序或系统内的纵向与横向协作。模块协作肯定是分时间进行的。而线程协作却有可能是或至少可以看成是同时进行的。 如果JDBC CONNECTION类的的所有STATEMENT操作都是非阻塞的,那么意味着同一个连接的STATEMENTS可以同时进行它们的动作。这样的话,就没有必要一定要用多个连接去连接同一个数据库。 如果用一个连接就可以达到同时即并发与数据库通信的目的,那我为什么要用连接池呢?特别是在并不存在任何事务性需求的环境下? 来源: oschina 链接: https://my.oschina.net/u/109289/blog

并发 并行 同步 异步 多线程的区别

浪子不回头ぞ 提交于 2019-12-03 14:19:47
1. 并发:在 操作系统 中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个 处理机 上运行。其中两种并发关系分别是同步和互斥 2. 互斥:进程间相互排斥的使用临界资源的现象,就叫互斥。 3. 同步:进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的说明:就是前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个进程必须等待。具有同步关系的一组并发进程相互发送的信息称为消息或事件。 其中并发又有伪并发和真并发,伪并发是指单核处理器的并发,真并发是指多核处理器的并发。 4. 并行:在单处理器中多道程序设计系统中,进程被交替执行,表现出一种并发的外部特种;在多处理器系统中,进程不仅可以交替执行,而且可以重叠执行。在多处理器上的程序才可实现并行处理。从而可知,并行是针对多处理器而言的。并行是同时发生的多个并发事件,具有并发的含义,但并发不一定并行,也亦是说并发事件之间不一定要同一时刻发生。 5. 多线程:多线程是程序设计的逻辑层概念,它是进程中并发运行的一段代码。多线程可以实现线程间的切换执行。 6. 异步:异步和同步是相对的,同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。线程就是实现异步的一个方式

对BOOST 中同步互斥的一些理解

只谈情不闲聊 提交于 2019-12-03 05:56:02
对BOOST 中同步互斥的一些理解 首先,BOOST中有4种有关互斥量得概念。 1.LOCKABLE :仅支持排它型所有权 2.TIMEDLOCKABLE:支持带超时的排它型所有权 3.SHAREDLOCKABLE: 支持带超时的排他型所有权和共享型所有权(读写锁) 4.UPGRADELOCKABLE: 支持带超时的排他型所有权和共享型所有权,以及共享型所有权升级为排他型所有权(升级过程阻塞)(也支持降级) 可以看到2强化自1,3强化自2.4强化自3,支持某一概念则一定支持其强化自的概念。 boost::mutex 实现了LOCKABLE概念 (boost::recursive_mutex 是其递归锁的版本) boost::timed_mutex 实现了TIMEDLOCKABLE概念 (boost::recursive_timed_mutex 是其递归锁的版本) boost::shared_mutex实现了SHAREDLOCKABLE概念 boost::shared_mutex同样实现了UPGRADELOCKABLE概念 出于提供RAII操作风格和安全等其他一些原因BOOST不希望用户直接调用各种MUTEX类型中的相关接口,而是通过它提供的一些LOCK_TYPE来帮助我们调用。 主要的LOCK_TYPE包括: boost::unique_lock<LOCKABLE>

非阻塞同步算法与CAS(Compare and Swap)无锁算法

风流意气都作罢 提交于 2019-12-03 04:53:38
锁(lock)的代价 锁是用来做并发最简单的方式,当然其代价也是最高的。内核态的锁的时候需要操作系统进行一次上下文切换,加锁、释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放。在上下文切换的时候,cpu之前缓存的指令和数据都将失效,对性能有很大的损失。用户态的锁虽然避免了这些问题,但是其实它们只是在没有真实的竞争时才有效。 Java在JDK1.5之前都是靠synchronized关键字保证同步的,这种通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程持有守护变量的锁,都采用独占的方式来访问这些变量,如果出现多个线程同时访问锁,那第一些线线程将被挂起,当线程恢复执行时,必须等待其它线程执行完他们的时间片以后才能被调度执行,在挂起和恢复执行过程中存在着很大的开销。锁还存在着其它一些缺点,当一个线程正在等待锁时,它不能做任何事。如果一个线程在持有锁的情况下被延迟执行,那么所有需要这个锁的线程都无法执行下去。如果被阻塞的线程优先级高,而持有锁的线程优先级低,将会导致优先级反转(Priority Inversion)。 乐观锁与悲观锁 独占锁是一种悲观锁,synchronized就是一种独占锁,它假设最坏的情况,并且只有在确保其它线程不会造成干扰的情况下执行,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。而另一个更加有效的锁就是乐观锁

Linux下搭建SVN服务器完全手册

混江龙づ霸主 提交于 2019-12-03 03:03:02
Linux下搭建SVN服务器完全手册 系统环境 RHEL5.4最小化安装(关iptables,关selinux) + ssh + yum 一,安装必须的软件包. yum install subversion (SVN服务器) mysql-server (用于codestriker) httpd mod_dav_svn mod_perl (用于支持WEB方式管理SVN服务器) sendmail (用于配置用户提交代码后发邮件提醒) wget gcc-c++ make unzip perl* (必备软件包) ntsysv vim-enhanced (可选) 二,基本的SVN服务器配置 1,新建一个目录用于存储SVN所有文件 # mkdir /home/svn 2,新建一个版本仓库 # svnadmin create /home/svn/project 3,初始化版本仓库中的目录 # mkdir project project/server project/client project/test (建立临时目录) # svn import project/ file:///home/svn/project -m "初始化SVN目录" # rm -rf project (删除临时建立的目录) 4,添加用户 要添加SVN用户非常简单,只需在/home/svn/project/conf

生产者消费者模型的信号量+ReentrantLock的实现

我只是一个虾纸丫 提交于 2019-11-27 16:10:18
package cn.edu.sysu; import java.util.ArrayList; import java.util.concurrent.Semaphore; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class ObjectQueue{ private final int size=10; private final Semaphore notEmpty=new Semaphore(0); private final Semaphore notFull=new Semaphore(size); private ArrayList<Integer> ints=new ArrayList<Integer>(); private Lock lock=new ReentrantLock(); public ObjectQueue(){} public void putItem(Integer i){ try { notFull.acquire(); lock.lock(); ints.add(i); notEmpty.release(); } catch (Exception e) { System.out.println(