快速业务通道

java线程简介 -共享对数据的访问 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
线程会阻塞并等待,直到锁可用,当它可用时,就会获得这个锁,然后执行代码块。当控制退出受保护的代码块时,即到达了代码块末尾或者抛出了没有在 synchronized 块中捕获的异常时,它就会释放该锁。

这样,每次只有一个线程可以执行受给定监控器保护的代码块。从其它线程的角度看,该代码块可以看作是原子的,它要么全部执行,要么根本不执行。

java线程简介 -共享对数据的访问(2)

时间:2011-06-16

简单的同步示例

使用 synchronized 块可以让您将一组相关更新作为一个集合来执行,而不必担心其它线程中断或看到计算的中间结果。以下示例代码将打印“1 0”或“0 1”。如果没有同步,它还会打印“1 1”(或“0 0”,随便您信不信)。

public class SyncExample {   private static lockObject = new Object();   private static class Thread1 extends Thread {    public void run() {     synchronized (lockObject) {      x = y = 0;      System.out.println(x);     }    }   }   private static class Thread2 extends Thread {    public void run() {     synchronized (lockObject) {      x = y = 1;      System.out.println(y);     }    }   }   public static void main(String[] args) {    new Thread1().run();    new Thread2().run();   } }

在这两个线程中都必须使用同步,以便使这个程序正确工作。

Java 锁定

Java 锁定合并了一种互斥形式。每次只有一个线程可以持有锁。锁用于保护代码块或整个方法,必须记住是锁的身份保护了代码块,而不是代码块本身,这一点很重要。一个锁可以保护许多代码块或方法。

反之,仅仅因为代码块由锁保护并不表示两个线程不能同时执行该代码块。它只表示如果两个线程正在等待相同的锁,则它们不能同时执行该代码。

在以下示例中,两个线程可以同时不受限制地执行 setLastAccess() 中的 synchronized 块,因为每个线程有一个不同的 thingie 值。因此,synchronized 代码块受到两个正在执行的线程中不同锁的保护。

public class SyncExample {   public static class Thingie {    private Date lastAccess;    public synchronized void setLastAccess(Date date) {     this.lastAccess = date;    }   }   public static class MyThread extends Thread {    private Thingie thingie;    public MyThread(Thingie thingie) {     this.thingie = thingie;    }    public void run() {     thingie.setLastAccess(new Date());    }   }   public static void main() {    Thingie thingie1 = new Thingie(),     thingie2 = new Thingie();    new MyThread(thingie1).start();    new MyThread(thingie2).start();   } }

java线程简介 -共享对数据的访问(3)

时间:2011-06-16

同步的方法

创建 synchronized 块的最简单方法是将方法声明成 synchronized。这表示在进入方法主体之前,调用者必须获得锁:

public class Point {   public synchronized void setXY(int x, int y) {    this.x = x;    this.y = y;   } }

对于普通的 synchronized方法,这个锁是一个对象,将针对它调用方法。对于静态 synchronized 方法,这个锁是与 Class 对象相关的监控器,在该对象中声明了方法。仅仅因为 setXY() 被声明成 synchronized 并不表示两个不同的线程不能同时执行 setXY(),只要它们调用不同的 Point 实例的 setXY() 就可同时执行。对于一个 Point 实例,一次只能有一个线程执行 setXY(),或 Point 的

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号