面试高并发编程——synchronized(加锁)

并发——synchronized(加锁)

一、声明一个对象,专门用来管理锁

/**
 * synchronized关键字
 * 对某个对象加锁
 */

public class T {

    private int count = 10;
    private Object o = new Object();//声明一个对象,专门用来管理锁

    public void m() {
        synchronized(o) { //任何线程要执行下面的代码,必须先拿到o的锁
            count--;
            System.out.println(Thread.currentThread().getName() + " count = " + count);
        }
    }

}

二、对this加锁

/**
 * synchronized关键字
 * 对某个对象加锁
 */
public class T {

    private int count = 10;

    public void m() {
        synchronized(this) { //任何线程要执行下面的代码,必须先拿到this的锁
            count--;
            System.out.println(Thread.currentThread().getName() + " count = " + count);
        }
    }

}

三、执行方法时每次都加锁,直接对方法名进行加锁

/**
 * synchronized关键字
 * 对某个对象加锁
 */

public class T {

    private int count = 10;

    public synchronized void m() { //等同于在方法的代码执行时要synchronized(this)
        count--;
        System.out.println(Thread.currentThread().getName() + " count = " + count);
    }

}

四、当锁定静态方法时,由于静态方法不需要通过对象可以直接进行调用,因此锁定静态方式时等同于synchronized(对象名.class)

/**
 * synchronized关键字
 * 对某个对象加锁
 */

public class T {

    private static int count = 10;

    public synchronized static void m() { //这里等同于synchronized(T.class)
        count--;
        System.out.println(Thread.currentThread().getName() + " count = " + count);
    }

    public static void mm() {
        synchronized(T.class) { //考虑一下这里写synchronized(this)是否可以?
            count --;
        }
    }

}

面试注意:

  1. synchronized并不是对代码片段进行加锁,而是对对象进行加锁!
  2. 一个synchronized代码块相当于一个原子操作,是不可分的,在线程在执行该代码块的时候,是不可以被打断的,只有当该线程执行完的时候,才能够继续执行同一段代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值