synchronized的用法与注意事项

synchronized关键字在java多线程编程过程中非常的有用,不过在编程过程中由于对synchronized的理解不足,也会有很多坑。
synchronized(object)是最常用的方法,它可以锁住需要访问的代码块,使只有一个线程访问而达到同步的目的。例如如下代码:

public class MulThreadTest {
    public static int a = 0;
    public  void addInt1(){
        synchronized(this){
            a++;
            System.out.println(a);
        }
    }
    public static void main(String[] args){
        final MulThreadTest test = new MulThreadTest();
        for(int i=0;i<3;i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    for(int j=0;j<100;j++)
                        test.addInt1();
                }
            }).start();
        }
    }
}

运行上述代码没有问题,synchronized使用this做锁对象,即使用的是引用的对象test做锁对象。因为synchronized包含的代码块包含了方法区里的所有代码,所以方法addInt1()等同如下形式:

    public synchronized void addInt2(){
        a++;
        System.out.println(a);
    }

如果main函数的方法将final对象test放入多线程中,如下:

    public static void main(String[] args) throws InterruptedException {
        for(int i=0;i<3;i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    MulThreadTest test = new MulThreadTest();
                    for(int j=0;j<100;j++)
                        test.addInt1();
                }
            }).start();
        }
    }

此时,运行代码会发现结果不是我们想要的。因为此时运行的每一个线程都有一个锁对象test,他们之间没有做到互斥访问,此时我们就需要更改addInt1()方法如下:

    public void addInt3(){
        synchronized (MulThreadTest.class) {
            a++;
            System.out.println(a);
        }
    }

将锁加在类上或者声明一个静态对象做为锁对象 :
static Object object = new Object();

总结:
synchronized的多线程使用关键是看哪个作为锁对象,如果锁的不是同一个对象,那么就无法达到同步的目的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值