Java synchronized详解

来源:互联网 发布:云杉网络 张天鹏 编辑:程序博客网 时间:2024/06/08 16:25

原文链接

原文链接:http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html

前言

android学的迷迷糊糊的,跟师兄请了个假,下午想看会书,这里转载一篇讲java synchronized的文章。


synchronized

java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程在执行该段代码:
  1. 当两个并发线程访问同一对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行,另一个线程必须等待当前线程执行玩这个代码块以后才能执行该代码块;
  2. 然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块;
  3. 尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞;
  4. 以上规则对其它对象锁同样适用。

举例说明

1. 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码时,一个时间内只能有一个线程得到执行,另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块

public class TestSync implements Runnable {  @Override  public void run() {    synchronized (this) {      for (int i = 0; i < 5; i++) {        System.out.println(Thread.currentThread().getName() + "synchronized loop" + i);      }    }  }  public static void main(String[] args) {    TestSync t1 = new TestSync();    Thread t2 = new Thread(t1, "A");    Thread t3 = new Thread(t1, "B");    t2.start();    t3.start();  }}

2. 当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object的非synchronized(this)同步代码块

public class TestSync {  public void m4t1() {    synchronized(this) {      int i = 5;      while (i -- > 0) {        System.out.println(Thread.currentThread().getName() + ":" + i);        try {          Thread.sleep(500);        } catch(InterruptedException is) {          is.printStackTrace();        }      }    }  }      public void m4t2() {    int i = 5;    while (i -- > 0) {      System.out.println(Thread.currentThread().getName() + ":" + i);      try {        Thread.sleep(500);      } catch(InterruptedException is) {        is.printStackTrace();      }    }  }    public static void main(String[] args) {    final TestSync myt2 = new TestSync();    new Thread(new Runnable() {            @Override      public void run() {        myt2.m4t1();      }    }, "t1 ").start();        new Thread(new Runnable() {            @Override      public void run() {        myt2.m4t2();      }    }, "t2 ").start();  }}

3. 当一个线程访问object的一个synchronized(this)同步代码块时,它就获得这个object对象锁,其他线程对object中所有其它synchronized(this)同步代码块的访问被阻塞

package learn;public class TestSync {  public void m4t1() {    synchronized(this) {      int i = 5;      while (i -- > 0) {        System.out.println(Thread.currentThread().getName() + ":" + i);        try {          Thread.sleep(500);        } catch(InterruptedException is) {          is.printStackTrace();        }      }    }  }      public synchronized void m4t2() {    int i = 5;    while (i -- > 0) {      System.out.println(Thread.currentThread().getName() + ":" + i);      try {        Thread.sleep(500);      } catch(InterruptedException is) {        is.printStackTrace();      }    }  }    public static void main(String[] args) {    final TestSync myt2 = new TestSync();    new Thread(new Runnable() {            @Override      public void run() {        myt2.m4t1();      }    }, "t1 ").start();        new Thread(new Runnable() {            @Override      public void run() {        myt2.m4t2();      }    }, "t2 ").start();  }}




0 0
原创粉丝点击