C# Lock、Monitor避免死锁】的更多相关文章

本篇从 Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler 的类关系图开始,希望通过本篇的介绍能对常见的线程同步方法有一个整体的认识,而对每种方式的使用细节,适用场合不会过多解释. 让我们来看看这几个类的关系图: 1. lock 关键字     lock 是 C# 关键词,它将语句块标记为临界区,确保当一个线程位于代码的临界区时,另一个线程不进入临界区.如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放.方…
本篇从Monitor,Mutex,ManualResetEvent,AutoResetEvent,WaitHandler的类关系图开始,希望通过 本篇的介绍能对常见的线程同步方法有一个整体的认识,而对每种方式的使用细节,适用场合不会过多解释.让我们来看看这几个类的关系图: 1.lock关键字 lock是C#关键词,它将语句块标记为临界区,确保当一个线程位于代码的临界区时,另一个线程不进入临界区.如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放.方法是获取给定对象的互斥…
[源码下载] 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 线程同步 lock - 其实就是对 Monitor.Enter() 和 Monitor.Exit() 的一个封装 Monitor - 锁 Interlocked - 为多个线程共享的数字型变量提供原子操作 Mute…
异步方法内无法使用Monitor 和lock 所以只能用System.Threading.SemaphoreSlim了 //Semaphore (int initialCount, int maximumCount); //initialCount代表还分配几个线程,比如是1,那就是还能允许一个线程继续跑锁起来的代码 //maximumCount代表最大允许数,比如是1,那就是进去1个线程,就会锁起来 System.Threading.SemaphoreSlim slimlock = new S…
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ConsoleApplication1 { class Program     { static void Main(string[] args) { object lock1 = new object(); object lock2 = new object…
看下组织结构: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex System.Threading.Semaphore System.Threading.EventWaitHandle System.Threading.ManualResetEvent System.Threading.AutoResetEvent System.Object System.Thre…
我们知道lock实际上一个语法糖糖,C#编译器实际上把他展开为Monitor.Enter和Monitor.Exit,即: lock(lockObj) { //... } ////相当于(.Net4以前): Monitor.Enter(lockObj); try { //... } finally { Monitor.Exit(lockObj); } 但是,这种实现逻辑至少理论上有一个错误:当Monitor.Enter(lockObj);刚刚完成,还没有进入try区的时候,有可能从其他线程发出了T…
innodb的事务隔离级别是可重复读级别且innodb_locks_unsafe_for_binlog禁用,也就是说允许next-key lock CREATE TABLE `LockTest` (   `order_id` varchar(20) NOT NULL,   `id` bigint(20) NOT NULL AUTO_INCREMENT,   PRIMARY KEY (`id`),   KEY `idx_order_id` (`order_id`) ) ENGINE=InnoDB …
Lock关键字 C#提供lock关键字实现临界区,MSDN里给出的用法: Object thisLock = new Object();lock (thisLock){   // Critical code section} 还有一种是比lock更“高级”的Monitor: private static object obj = new object(); public static void SomeMethod() { bool lockTaken=false; //假定没有获取锁 try…
出处: http://www.cnblogs.com/sunss/p/3166550.html 昨天看到一个很有意思的死锁,拿来记录下: 环境:deadlock on 事务隔离级别: read commited 表结构: root@test 08:34:01>show create table lingluo\G *************************** 1. row *************************** Table: lingluo Create Table:…
本篇继续介绍WaitHandler类及其子类 Mutex,ManualResetEvent,AutoResetEvent的用法..NET中线程同步的方式多的让人看了眼花缭乱,究竟该怎么去理解呢?其实,我们抛开.NET环境看线程同步,无非是执行两种操作:一是互斥/加锁,目的是保证临界区代码操作的"原子性":另一种是信号灯操作,目的是保证多个线程按照一定顺序执行,如生产者线程要先于消费者线程执行..NET中线程同步的类无非是对这两种方式的封装,目的归根结底都可以归结为实现互斥/ 加锁或者是…
Lock Monitor   多线程操作的时候,为防止死锁,我们经常采用加Lock的方式解决,下面就谈一下Lock的具体运用和Lock可以用什么来替换 首先,看代码: private static object syncroot = new object(); public static void Gets() { lock(syncroot) { Console.WriteLine("sbzgw"); Console.Read(); } } 上段代码中,是Lock的典型应用 但是,在…
使用lock场景 多线程环境中,不使用lock锁,会形成竞争条件,导致错误. 使用lock 锁 可以保证当有线程操作某个共享资源时,其他线程必须等待直到当前线程完成操作. 即是多线程环境,如果一个线程锁定了共享资源,需要访问该资源的其他线程则会处于阻塞状态,并等待直到该共享资源接触锁定. using System; using System.Threading; namespace testthread_keyword_lock { class Program { static void Mai…
“线程同步”的含义   当一个进程启动了多个线程时,如果需要控制这些线程的推进顺序(比如A线程必须等待B和C线程执行完毕之后才能继续执行),则称这些线程需要进行“线程同步(thread synchronization)”. 线程同步的道理虽然简单,但却是给多线程开发带来复杂性的根源之一.当线程同步不好时,有可能会出现一种特殊的情形——死锁(Dead Lock). “死锁”的含义   死锁表示系统进入了一个僵化状态,所有线程都没有执行完毕,但却谁也没法继续执行.究其根源,是因为“进程推进顺序不当”…
Lock是顶层接口,它的实现逻辑并未用到synchronized,而是利用了volatile的可见性.ReentrantLock对了Lock接口的实现主要依赖了Sync,而Sync继承了 AbstractQueuedSynchronizer(AQS) ReentrantLock: public class ReentrantLock implements Lock, java.io.Serializable { private static final long serialVersionUID…
1)Mutex:进程之间的同步(互斥量). 2)lock/Monitor……:线程同步.其中lock是Monitor的简化版本(直接生成try{Monitor.Enter(……)}finally{Monitor.Exit(……);}方法. 当然,Monitor还有Pulse方法,该方法对于锁定同一个对象的时候,允许其它线程进入准备区,同时配合Wait方法(Wait将自己暂时退出).某种情况下可以代替信号量(ManualResetEvent),考察以下例子(来源:http://bbs.csdn.n…
线上发现一个问题,应用在启动时会卡死,log上并没有什么异常输出,初判应该是死锁问题. 抓现场的thread dump文件, 确实是有两个线程有deadlock问题. 线程一 "HSFBizProcessor-8-thread-13" daemon prio=10 tid=0x00007fc686a83000 nid=0x37128 waiting for monitor entry [0x000000004b7f3000] java.lang.Thread.State: BLOCKE…
Motivation 承并发编程笔记Outline,这篇文章专注于记录学习基于锁的并发概念的过程中出现的一些知识点,为并发高层抽象做必要的准备. 尽管存在Doug Lee开山之作Concurrent Programming in Java, 2th edition: Desing Principles and Patterns.Brian Goetz撰写的一些列文章(http://www.ibm.com/developerworks/cn/java/j-jtp/ ).以及随后出现的一系列有关Ja…
简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理解死锁.比如说一个经典的例子就是汽车(主体)对于道路(资源)的征用,如图1所示. 图1.对于死锁的直观理解 在图1的例子中,每队汽车都占有一条道路,但都需要另外一队汽车所占有的另一条道路,因此互相阻塞,谁都无法前行,因此造成了死锁.由这个简单的例子可以看出,发生死锁需要四个必要条件,如下: 1)互斥…
今天看了一篇关于死锁检查的blog. Advanced InnoDB Deadlock Troubleshooting – What SHOW INNODB STATUS Doesn’t Tell You, and What Diagnostics You Should be Looking At One common cause for deadlocks when using InnoDB tables is from the existence of foreign key constra…
本文中我将展示一段垃圾代码,这段代码会产生死锁,这样围绕这段代码重点展示三种不同的方法来分析线程日志,从而得知什么地方有问题. 下面的讨论将用到两个类 Account 和 DeadlockDemo classes 定义如下: public class Account { private final int number; private int balance; public Account(int number, int openingBalance) {     this.number =…
简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理解死锁.比如说一个经典的例子就是汽车(主体)对于道路(资源)的征用,如图1所示. 图1.对于死锁的直观理解 在图1的例子中,每队汽车都占有一条道路,但都需要另外一队汽车所占有的另一条道路,因此互相阻塞,谁都无法前行,因此造成了死锁.由这个简单的例子可以看出,发生死锁需要四个必要条件,如下: 1)互斥…
一.lock关键词说明 1. lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁. 2. lock 语句块锁定,功能等同于 Monitor.Enter(obj): //代码段 Monitor.Exit(obj): 3. lock语句块锁定和Monitor线程锁,不能跨进程同步 二.备注 lock 关键字可确保当一个线程位于代码的临界区时,另一个线程不会进入该临界区. 如果其他线程尝试进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放. 线程 这节讨…
package mytask; public class Task { public static void main(String[] args) { DeadThread thread = new DeadThread(); Thread t1 = new Thread(thread); t1.setName("a"); Thread t2 = new Thread(thread); t2.setName("b"); t1.start(); t2.start()…
主要学习多线程的并发访问,也就是使得线程安全. 同步的单词为synchronized,异步的单词为asynchronized 同步主要就是通过锁的方式实现,一种就是隐式锁,另一种是显示锁Lock,本节主要研究隐式锁synchronized的使用. 每个Java对象都可以用作一个实现同步的锁,注意前提是Java对象,也就是类型必须是引用类型,这些锁被称为内置锁(Instrinsic Lock)或者监视器锁(Monitor Lock),是一种互斥锁. 1. synchronized同步方法 “非线程…
一.介绍 jstack是java虚拟机自带的一种堆栈跟踪工具.jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的这种方式: 命令格式 jstack [-l] pid 主要分为两个功能: a.  针对活着的进程做本地的或远程的线程dump: b.  针对core文件做线程dump. jstack用于生成java虚拟机当前时刻的线程快照.线程快…
一.实战死循环导致CPU飙高 top -p pid -H jstack pid printf "%s"  十进制的线程id 二.创建CUP100%实例(死循环) 1.创建CpuController @RestController public class CpuController { @RequestMapping("/loop") public List<Long> loop(){ String data = "{\"data\&…
简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理解死锁.比如说一个经典的例子就是汽车(主体)对于道路(资源)的征用,如图1所示. 图1.对于死锁的直观理解 在图1的例子中,每队汽车都占有一条道路,但都需要另外一队汽车所占有的另一条道路,因此互相阻塞,谁都无法前行,因此造成了死锁.由这个简单的例子可以看出,发生死锁需要四个必要条件,如下: 1)互斥…
今天面试有一道题,写一个死锁的程序,自己也是短路了,没写出来,回来写下. 死锁常见的情况是A线程持有a锁.阻塞于b锁,B线程持有b锁,阻塞于a锁,形成一个循环阻塞的状态. import java.util.concurrent.TimeUnit; public class CyclicLock { private static Object o1 = new Object(); private static Object o2 = new Object(); public static void…
package com.xwolf.java.thread.ch2; /** * Created by Administrator on 2016/1/4 0004. */ public class DeadLock { private static String a ="A"; private static String b ="B"; public static void main(String[] args) { new DeadLock().deadLock…