了解ReentrantLocks和Thread基础知识

时间:2012-09-17 16:26:59

标签: java

我正在尝试使用线程编写基本程序。假设我有两个线程,t1和t2并锁定x。假设锁定x被分配给t1。什么时候由于锁定x被分配给t1,t2将无法处理?我试图创建一个简单的例子来演示锁/线程如何工作。

我感谢你对这件事的任何帮助。

这是我到目前为止所得到的:

班级天行者:

import java.util.*;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Skywalker{
    public static void main(String args[]){
        Thread t1 = new Thread("station 1");
        Thread t2 = new Thread("station 2");

        t1.start();
        t2.start();
    }
}
达斯上课:

import java.util.Random;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Darth implements Runnable{
    String stationName;
    Lock x = new ReentrantLock();
    Random r = new Random();

    public Darth(String name){
        stationName = name;
    }

    public void run(){
        try{
            x.lock();
            System.out.println(stationName + "is working");
            sleep(randomTime);
            x.unlock();

        } catch(Exception e) {
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您应该将锁定放在一个类中以保护“资源访问”,例如:

class SharedResource {
    private static Lock lock = new ReentrantLock();

    public static void consumeResource(){
        try{
            lock.lock();
            //just one thread a time here
            int i = 10;
            //mock consuming shared resource:
            while(i>0){
                i--;
                System.out.println(Thread.currentThread().getName() + " is in");
                Thread.sleep(1000);
            }  
        }finally{
            lock.unlock();
        }
    }
 }

现在只需一个线程就可以访问在unlock / unlock语句中的consumeResource方法中的代码行。很容易显示从Darth run方法调用consumeResource。