java synchronized5种使用方式

    说起java中的synchronized,相信大多数学习java的人都不陌生,这里是谈synchronized的使用,原理不在这里阐述,synchronized一共有5种使用方式,但归根结底,其实synchronized就一种使用方式,synchronized就是对对象进行加锁。

1synchronized(object)锁object对象
2synchronized(this)锁对象本身
3synchronized修饰非静态方法锁对象本身
4synchronized(XXXX.class)锁类的Class对象
5synchronized修饰静态方法锁类的Class对象

代码如下:

package com.newbie.syn;

/**
 * synchronized不管放在方法的前面,还是对象的前面,还是放在.class的前面,最终synchronized都是对对象进行加锁
 * synchronized的5种用法
 * 1.synchronized(object)     锁object对象
 * 2.synchronized(this)       锁对象本身
 * 3.synchronized修饰非静态方法 锁对象本身
 * 4.synchronized(XXXX.class) 锁类的Class对象
 * 5.synchronized修饰静态方法   锁类的Class对象
 */
public class SynchronizedCase {
    //需要加锁的对象
    private static final Object object = new Object();
    //需要操作的数值
    private static int num;

    /**
     * synchronized对Object对象加锁 实现对代码块的同步
     */
    public void addNum1(){
        synchronized(object) {
            num++;
        }
    }

    /**
     * synchronized对this加锁 也就是对象本身加锁 实现对代码块的同步
     */
    public void addNum2(){
        synchronized(this) {
            System.out.println("addNum2 ----------start----------");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
            }
            num++;
            System.out.println("addNum2 ----------end----------num:" + num);
        }
    }

    /**
     * 锁住非静态方法 这里和addNum2一样,其实是对对象本身加锁 实现方法中的代码同步
     */
    public synchronized void addNum3(){
        System.out.println("addNum3 ----------start----------");
        num++;
        System.out.println("addNum3 ----------end----------num:" + num);
    }

    /**
     * 在Java中,每一个类都对应着一个Class对象
     * synchronized对SynchronizedCase.class加锁 也就是Class对象加锁 实现对代码块的同步
     *
     */
    public void addNum4(){
        synchronized(SynchronizedCase.class) {
            System.out.println("addNum4 ----------start----------");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
            }
            num++;
            System.out.println("addNum4 ----------end----------num:" + num);
        }
    }

    /**
     * 在Java中,每一个类都对应着一个Class对象
     * 锁住静态方法 这里和addNum4一样,其实是对Class对象加锁 实现方法中的代码同步
     */
    public synchronized static void addNum5() {
        System.out.println("addNum5 ----------start----------");
        num++;
        System.out.println("addNum5 ----------end----------num:" + num);
    }
}

第一组测试:测试对象锁,addNum2和addNum3同时执行,测试代码如下:

    /**
     * 测试代码
     */
    public static void main(String[] args) {
        SynchronizedCase synCase = new SynchronizedCase();
        //addNum2和addNum3都是锁对象
        new Thread(() -> synCase.addNum2()).start();
        new Thread(() -> synCase.addNum3()).start();
    }

测试结果:

 addNum2、addNum3按顺序执行

第二组测试:测试类Class对象锁,addNum4和addNum5同时执行,测试代码如下:

    /**
     * 测试代码
     */
    public static void main(String[] args) {
        SynchronizedCase synCase = new SynchronizedCase();
        //addNum4和addNum5都是锁类,其实是锁的Class对象
        new Thread(() -> synCase.addNum4()).start();
        new Thread(() -> SynchronizedCase.addNum5()).start();
    }

测试结果:

 addNum4、addNum5按顺序执行 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值