并发性和多线程(1)

来源:互联网 发布:java 日志输出级别 编辑:程序博客网 时间:2024/06/03 21:25

同步块


同步关键字synchronized

java中的同步代码块用synchronized标记,同步在某个对象上。对象上的同步块只能被一个线程进入并进行操作,其它线程等待,进入阻塞状态。直到进入同步块的线程退出。java中有四种不同的同步块:
1. 实例方法;
2. 静态方法;
3. 实例方法中的同步块;
4. 静态方法中的同步块。

实例方法同步

public synchronized void add(int value){    this.count+=value;}

在方法中声明关键字synchronized,表示该方法是同步的。实例方法同步是同步在拥有该方法的对象上的,因此每个实例其方法同步其实都同步在了不同的对象上。每个实例对象持有一个线程,如果有多个实例,那么就应该对应有多个线程。

静态方法同步

public static synchronized void add(int value){    this.count+=value;}

该方法同步在方法所属的类对象上,而在JVM中,一个类只能对应一个类对象,所以同步时只允许一个线程执行一个类的静态同步方法。

实例方法中的同步块

有时是不需要对整个方法进行同步,而只需要同步其中的某一部分。
在非同步的方法中的同步块:

public void add(int value){    synchronized(this){        this.count+=value;    }}

在同步构造器中用()包含起来的叫做监视器对象。本例中,同步实例方法使用调用该方法的实例本身(this)作为监视器对象。一次只能有一个线程在同步于同一个监视器对象的 Java 方法内执行。

静态方法中的同步块

public Class MyClass{    public static void plus(int value){        this.count+=value;    }    public static void add(int value){            synchronized(MyClass.class){                this.count+=value;            }        }    }}

这两个静态方法是不能同时执行的。
除非方法2中的同步对象不是MyClass。

原创粉丝点击