并发性和多线程(1)

同步块


同步关键字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。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值