WEB开发网
开发学院软件开发Java Java 多线程同步问题的探究(三、Lock来了,大家都... 阅读

Java 多线程同步问题的探究(三、Lock来了,大家都让开【1. 认识重入锁】)

 2010-05-14 00:00:00 来源:WEB开发网   
核心提示:在上一节中, 我们已经了解了Java多线程编程中常用的关键字synchronized,Java 多线程同步问题的探究(三、Lock来了,大家都让开【1. 认识重入锁】),以及与之相关的对象锁机制,这一节中,我们先来看一个多线程程序,它使用多个线程对一个Student对象进行访问,让我们一起来认识JDK 5中新引入的并发

在上一节中,

我们已经了解了Java多线程编程中常用的关键字synchronized,以及与之相关的对象锁机制。这一节中,让我们一起来认识JDK 5中新引入的并发框架中的锁机制。

我想很多购买了《Java程序员面试宝典》之类图书的朋友一定对下面这个面试题感到非常熟悉:

问:请对比synchronized与java.util.concurrent.locks.Lock 的异同。

答案:主要相同点:Lock能完成synchronized所实现的所有功能

主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。

恩,让我们先鄙视一下应试教育。

言归正传,我们先来看一个多线程程序。它使用多个线程对一个Student对象进行访问,改变其中的变量值。我们首先用传统的synchronized 机制来实现它:

public class ThreadDemo implements Runnable {
    class Student {
        private int age = 0;
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
    }
    Student student = new Student();
    int count = 0;
    public static void main(String[] args) {
        ThreadDemo td = new ThreadDemo();
        Thread t1 = new Thread(td, "a");
        Thread t2 = new Thread(td, "b");
        Thread t3 = new Thread(td, "c");
        t1.start();
        t2.start();
        t3.start();
    }
    public void run() {
        accessStudent();
    }
    public void accessStudent() {
        String currentThreadName = Thread.currentThread().getName();
        System.out.println(currentThreadName + " is running!");
        synchronized (this) {//(1)使用同一个ThreadDemo对象作为同步锁
            System.out.println(currentThreadName + " got lock1@Step1!");
            try {
                count++;
                Thread.sleep(5000);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                System.out.println(currentThreadName + " first Reading count:" + count);
            }
        }
       
        System.out.println(currentThreadName + " release lock1@Step1!");
        synchronized (this) {//(2)使用同一个ThreadDemo对象作为同步锁
            System.out.println(currentThreadName + " got lock2@Step2!");
            try {
                Random random = new Random();
                int age = random.nextInt(100);
                System.out.println("thread " + currentThreadName + " set age to:" + age);
                this.student.setAge(age);
                System.out.println("thread " + currentThreadName + " first  read age is:" + this.student.getAge());
                Thread.sleep(5000);
            } catch (Exception ex) {
                ex.printStackTrace();
            } finally{
                System.out.println("thread " + currentThreadName + " second read age is:" + this.student.getAge());
            }
        }
        System.out.println(currentThreadName + " release lock2@Step2!");
    }
}

1 2 3 4  下一页

Tags:Java 线程 同步

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接