锁的一些理解

##锁的工作原理
在多线程中,使用最多的就是锁了。锁是如何避免多线程资源冲突呢?一开始我的理解是锁作为一种全局变量,只有去读锁的状态,一般来说读读不会冲突,只有读写和写写冲突。后来通过阅读才知道,锁是通过将查询和所属线程的两个步骤在物理方式上作为一个原子操作。即查询该锁的状态以及如果锁处于空闲状态时,将该锁属于本线程是一次性完成的。这样就可以实现锁的范围内安全。
##锁的对象
在多线程程序中,为了避免资源冲突,常常加各种锁。常见的是互斥锁,如何确定使用锁的对象和范围呢?
从锁的用途可以看出是需要根据被保护对象的多少来生成锁的数量(这明显是废话,可是一开始由于理解不对被线程个数所迷惑)。
##锁的范围
结合以往经验来看,锁的范围是越小越好。一来是为了安全,代码异常可能性小;其次,可以提高执行效率,锁的左右就是将本来并行执行的变成串行。如果一个锁的范围内有io等耗时操作将得不偿失。windows语言中Concurrent相关容器就是在内部加锁,缩小了锁的范围从而提高系统的运行。
##死锁
什么情况下会造成死锁,以我遇到两种这里mark一下,第一个是锁的范围太大,锁里面套着其他锁,当线程分开时,很有可能会出现这种一个线程等待里面的锁释放,而另外一个锁等待外面的锁释放,导致死锁。另外一种情况就是锁的范围内异常退出或者有其他返回渠道,特别是一些强制转移的语句,这种情况会导致锁没有被释放,当下次进到该线程时会出现该线程一直等待情况。

你可能感兴趣的:(随笔,经验分享)