快速业务通道

Java线程:线程的同步 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23

Java线程:线程的同步

时间:2010-12-08 BlogJava Werther

一、同步问题提出

线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏。

例如:两个线程ThreadA、ThreadB都操作同一个对象Foo对象,并修改Foo对 象上的数据。

public class Foo {     private int x = 100;     public int getX() {         return x;     }     public int fix(int y) {         x = x - y;         return x;     } } public class MyRunnable implements Runnable {     private Foo foo = new Foo();     public static void main(String[] args) {         MyRunnable r = new MyRunnable();         Thread ta = new Thread(r, "Thread-A");         Thread tb = new Thread(r, "Thread-B");         ta.start();         tb.start();     }     public void run() {         for (int i = 0; i < 3; i++) {             this.fix(30);             try {                 Thread.sleep(1);             } catch (InterruptedException e) {                 e.printStackTrace();             }             System.out.println(Thread.currentThread ().getName() + " : 当前foo对象的x值= " + foo.getX());         }     }     public int fix(int y) {         return foo.fix(y);     } }

运行结果:Thread-A : 当前foo对象的x值= 40 Thread-B : 当前foo对象的x值= 40 Thread-B : 当前foo对象的x值= -20 Thread-A : 当前foo对象的x值= -50 Thread-A : 当前foo对象的x值= -80 Thread-B : 当前foo对象的x值= -80 Process finished with exit code 0

从结果发现,这样的输出值明显是不合理的。原因是两个线程不加控制的访 问Foo对象并修改其数据所致。

如果要保持结果的合理性,只需要达到一个目的,就是将对Foo的访问加以限 制,每次只能有一个线程在访问。这样就能保证Foo对象中数据的合理性了。

在具体的Java代码中需要完成一下两个操作:

把竞争访问的资源类Foo变量x标识为private;

同步哪些修改变量的代码,使用synchronized关键字同步方法或代码。

Java线程:线程的同步(2)

时间:2010-12-08 BlogJava Werther

二、同步和锁定

1、锁的原理

Java中每个对象都有一个内置锁

当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代 码类的当前实例(this实例)有关的锁。获得一个对象的锁也称为获取锁、锁定 对象、在对象上锁定或在对象上同步。

当程序运行到synchronized同步方法或代码块时才该对象锁才起作用。

一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以 获得锁,直到第一个线程释放(或返回)锁。这也意味着任何其他线程都不能进 入该对象上的synchronized方法或代码块,直到该锁被释放。

释放锁是指持锁线程退出了synchronized同步方法或代码块。

关于锁和同步,有一下几个要点:

1)、只能同步方法,而不能同步变量和类;

2)、每个对象只有一个锁;当提到同步时,应该清楚在什么上同步?也就是 说,在哪个对象上同步?

3)、不必同步类中所有的方法,类可以同时拥有同步和非同步方法。

4)、如果两个线程要执行一个类中的synchronized方法,并且两个线程使用 相同的实例来调用方法,那么一次只能有一个线程能够执行方法,另一个需要等 待,直到锁被释放。也就是说:如果一个线程在对象上

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号