同步机制Lock初学(转)

前段时间review同事的代码,发现可以简化成如下的模型:

Thread 1 Thread 2
lock.lock(); 
condition.await(); 
lock.unlock()
lock.lock(); 
condition.signal(); 
lock.unlock();

怀疑是个死锁。写了下面这个case模拟了一下,却没有问题。

但是T2为何能进入signal呢?

根据javadoc的文档,这明显是第三种情况:

public void lock()
Acquires the lock.

Acquires the lock if it is not held by another thread and returns immediately, setting the lock hold count to one.

If the current thread already holds the lock then the hold count is incremented by one and the method returns immediately.

If the lock is held by another thread then the current thread becomes disabled for thread scheduling purposes and lies dormant until the lock has been acquired, at which time the lock hold count is set to one.

原来是因为T1进入await了,那么这个条件上的lock就自动释放了,文档如下:

void await()
           throws InterruptedException

Causes the current thread to wait until it is signalled or interrupted.

The lock associated with this Condition is atomically released and the current thread becomes disabled for thread scheduling purposes and lies dormant until one of four things happens:

代码如下:

import java.util.Date; 
import java.util.concurrent.locks.Condition; 
import java.util.concurrent.locks.Lock; 
import java.util.concurrent.locks.ReentrantLock;

public class LockTest {

Lock lock = new ReentrantLock(); 
    Condition finishCondition = lock.newCondition();

class T1 implements Runnable {

public void run() { 
            try { 
                lock.lock(); 
                System.out.println("enter T1:" + new Date()); 
                try { 
                    finishCondition.await(); 
                    System.out.println("end wating T1:" + new Date()); 
                } catch (Exception ex) { 
                    ex.printStackTrace(); 
                } 
            } finally { 
                lock.unlock(); 
                System.out.println("exit T1:" + new Date()); 
            }

}

}

class T2 implements Runnable {

public void run() { 
            try { 
                lock.lock(); 
                System.out.println("enter T2:" + new Date()); 
                try { 
                    Thread.sleep(1000); 
                    finishCondition.signal(); 
                } catch (Exception ex) { 
                    ex.printStackTrace(); 
                } 
            } finally { 
                lock.unlock(); 
                System.out.println("exit T2:" + new Date()); 
            } 
        } 
    }

public void run() throws Exception { 
        new Thread(new T1()).start(); 
        Thread.sleep(50); 
        new Thread(new T2()).start(); 
    }

public static void main(String[] args) throws Exception { 
        LockTest lt = new LockTest(); 
        lt.run(); 
        Thread.sleep(3000); 
        System.out.println("exit main."); 
    }

}

http://www.cnblogs.com/alphablox/archive/2013/01/13/2858264.html

时间: 2024-10-16 05:39:50

同步机制Lock初学(转)的相关文章

python多线程同步机制Lock

#!/usr/bin/env python# -*- coding: utf-8 -*- import threadingimport time value = 0lock = threading.Lock() def add(): global value with lock: new_value = value + 1 time.sleep(0.001) value = new_value if __name__ == '__main__': threads = [] for i in ra

线程同步机制(一)--Synchronized,Lock

多个执行线程共享一个资源的情形是最常见的并发编程情景之一.在并发应用中常常遇到这样的情景:多个线程读或者写相同的数据,或者访问相同的文件或者数据库连接.为了防止这些共享资源可能出现错误或者数据不一致,人们引入了临界区(critical section)概念.临界区是一个用以访问共享资源的代码块,这个代码块中同一时间只允许一个线程执行. 为了实现这个临界区,Java提供了同步机制.当一个线程试图访问一个临界区时,它将使用一种同步机制来查看是不是已经有其他线程进入临界区.如果没有,它就进入临界区,如

[内核同步]浅析Linux内核同步机制

转自:http://blog.csdn.net/fzubbsc/article/details/37736683?utm_source=tuicool&utm_medium=referral 很早之前就接触过同步这个概念了,但是一直都很模糊,没有深入地学习了解过,近期有时间了,就花时间研习了一下<linux内核标准教程>和<深入linux设备驱动程序内核机制>这两本书的相关章节.趁刚看完,就把相关的内容总结一下.为了弄清楚什么事同步机制,必须要弄明白以下三个问题: 什么是互

Linux 内核的同步机制,第 1 部分 + 第二部分(转)

http://blog.csdn.net/jk198310/article/details/9264721  原文地址: Linux 内核的同步机制,第 1 部分 一. 引言 在现代操作系统里,同一时间可能有多个内核执行流在执行,因此内核其实象多进程多线程编程一样也需要一些同步机制来同步各执行单元对共享数据的访问.尤其是在多处理器系统上,更需要一些同步机制来同步不同处理器上的执行单元对共享的数据的访问.在主流的Linux内核中包含了几乎所有现代的操作系统具有的同步机制,这些同步机制包括:原子操作

浅谈利用同步机制解决Java中的线程安全问题

我们知道大多数程序都不会是单线程程序,单线程程序的功能非常有限,我们假设一下所有的程序都是单线程程序,那么会带来怎样的结果呢?假如淘宝是单线程程序,一直都只能一个一个用户去访问,你要在网上买东西还得等着前面千百万人挑选购买,最后心仪的商品下架或者售空......假如饿了吗是单线程程序,那么一个用户得等前面全国千万个用户点完之后才能进行点餐,那饿了吗就该倒闭了不是吗?以上两个简单的例子,就说明一个程序能进行多线程并发访问的重要性,今天就让我们去了解一下Java中多线程并发访问这个方向吧. **第一

Linux内核同步机制

http://blog.csdn.net/bullbat/article/details/7376424 Linux内核同步控制方法有很多,信号量.锁.原子量.RCU等等,不同的实现方法应用于不同的环境来提高操作系统效率.首先,看看我们最熟悉的两种机制——信号量.锁. 一.信号量 首先还是看看内核中是怎么实现的,内核中用struct semaphore数据结构表示信号量(<linux/semphone.h>中): [cpp] view plaincopyprint? struct semaph

Python多线程(2)——线程同步机制

本文介绍Python中的线程同步对象,主要涉及 thread 和 threading 模块. threading 模块提供的线程同步原语包括:Lock.RLock.Condition.Event.Semaphore等对象. 1. Lock 1.1 Lock对象的创建 Lock是Python中最底层的同步机制,直接由底层模块 thread 实现,每个lock对象只有两种状态——上锁和未上锁,不同于下文的RLock对象,Lock对象是不可重入的,也没有所属的线程这个概念. 可以通过下面两种方式创建一

Linux 下的同步机制

2017-03-10 回想下最初的计算机设计,在单个CPU的情况下,同一时刻只能由一个线程(在LInux下为进程)占用CPU,且2.6之前的Linux内核并不支持内核抢占,当进程在系统地址运行时,能打断当前操作的只有中断,而中断处理完成后发现之前的状态是在内核,就不触发地调度,只有在返回用户空间时,才会触发调度.所以内核中的共享资源在单个CPU的情况下其实不需要考虑同步机制,尽管表面上看起来是多个进程在同时运行,其实那只是调度器以很小的时间粒度,调度各个进程运行的结果,事实上是一个伪并行.但是随

java的线程同步机制synchronized关键字的理解

线程同步:               由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问. 需要明确的几个问题: 1)synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块.如果 再细的分类,synchronized可作用于instance变量.object reference(对象引用).static函数和clas