synchronized关键字的使用 .

来源:互联网 发布:悟空传说网络不大好 编辑:程序博客网 时间:2024/05/19 17:05

一、结论

      1.synchronized可以用于一个类的方法,如public synchronized void writeA,那么同步代码锁定的对象将是当前实例对象,任何现成访问该实例对象的其他同步方法将必须等待,直到方法writeA执行完成

       2.synchronized 也可以作用于一个代码块,如synchronized(this){}

       3.synchronized 还可以同步一个对象,如synchronized(object){}

二、示例代码

    1.TestSynchronize类的代码(测试同步的对象代码)

        /**
 *
 */
package com.my.test.sychronize;

/**
 * 同步类,测试同步的对象代码
 *
 * @author rey2008
 *
 */
public class TestSynchronize {

 // 单例对象
 static TestSynchronize m_instance = new TestSynchronize();

 /**
  * 返回单例对象
  *
  * @return
  */
 public static TestSynchronize getInstance() {
  return m_instance;
 }

 public synchronized void writeA(String _FlagThread) {
  // 假如执行时间是5秒
  try {
   Thread.sleep(5000);
  } catch (InterruptedException e) {
   e.printStackTrace();
  }
  System.out.println("ThreadFlag:::" + _FlagThread);

 }

 public synchronized void writeB() {
  System.out.println("bbbbbbbbbbbb");
 }
}

      2.TestSynchronizeMain类的代码(测试同步的方法入口)

package com.my.test.sychronize;

public class TestSynchronizeMain {

 public static void main(String[] args) {

  // 线程1
  Thread thread1 = new Thread() {
   public void run() {
    // 执行方法
    System.out.println("线程1准备执行writeA...");

    TestSynchronize.getInstance().writeA("aa");
    System.out.println("线程1的writeA执行成功...");
   }
  };

  // 线程2
  Thread thread2 = new Thread() {
   public void run() {
    // 执行方法
    System.out.println("线程2准备执行writeB...");
    TestSynchronize.getInstance().writeB();
    System.out.println("线程2的writeB执行成功...");
   }
  };

  // 执行线程
  thread1.start();

  thread2.start();

 }

}

    3.打印结果

      线程1准备执行writeA...
      线程2准备执行writeA...(由于线程1的writeA方法sleep了5秒,所以WriteB必须要等待WriteA执行完成才能够继续执行,虽然线程2没有sleep代码,但是writeB方法还是会在writeA方法执行成功后才输出调试信息
)
      ThreadFlag:::aa
      线程1的writeA执行成功...
      bbbbbbbbbbbb
      线程2的writeA执行成功..

 

 

备注:

       更多关于sychronize可以参考http://zhidao.baidu.com/question/84980331.html&__bd_tkn__=7aaa422570318a2a5205a93b8da52cb0c01695eb8078338d51fed8133ea5c69d362ad36bb4bcda3b39bb3949f6bbe47087ac3af56e60b1f4e7eb60157058f43a9d64aaf940491fc7006f450add3acb0a4f72ed730c5ec88edb39347575284729ca620d354eb2d9dc9a7beabbc9db810fc23c22f24f