Java + 线程系列之synchronized同步锁(五)

本文深入探讨Java中的synchronized关键字,解释其同步锁的概念,通过示例说明如何使用synchronized实现线程间的同步,以确保代码的正确执行顺序,防止并发问题。

同样 新建了一个synDemo类 来展示

public class SynDemo {

    private static Integer count = 10000;


    //锁是什么
    // 锁是一个对象
    // 假如A线程先访问这个del方法
    // 那么锁对象就会被A线程持特有其他(BCD)想访问del方法的时候
    // 就会发现锁对象被A线程拿走了,
    // 那么(BCD)就都不能进入到del方法中
    // 当A线程执行完毕del方法,会将锁对象释放出来
    // 这时候(BCD)线程再争夺执行权.
    // 谁抢到了,谁来执行sel方法 谁执行sel方法,
    // 那么谁就又拿到了锁对象
    // 这个时候剩下的两个线程就又进不来del方法中了

    //使用关键字的两种方式
    //1, 在方法声明上,使用synchronized关键字修饰
    //2, 使用synchronized代码块将要执行的代码包起来
    public synchronized void del() {
            for (int i = 0; i < 2500; i++) {
                count -= 1;
                 System.out.println(Thread.currentThread().getName() + "========" + count);
            }
    }
    //2, 使用synchronized代码块将要执行的代码包起来
    public void del1() {
        synchronized (this) {
            for (int i = 0; i < 2500; i++) {
                count -= 1;
                System.out.println(Thread.currentThread().getName() + "========" + count);
            }
        }
    }

    //show方法,也是被synchronized关键字修饰的
    // 而synchronized关键字修饰的方法的锁的对象,就是该方法的调用者
    //对象.方法() 这里调用show方法,与调用del方法的对象是一个
    //所以,show方法的锁对象与del方法的锁对象也就是一个了

    //而第一个线程已经进入了del方法,也就持有了锁对象
    // 第二个线程想要进入show方法
    // 需要等第一个线程从del方法中出来,释放锁对象的时候,才能进入到show方法中
  public synchronized void show(){
      for (int i = 0; i < 2000; i++) {
          System.out.println("*********show********");
      }
  }

public void show1(){
    synchronized (count){
        for (int i = 0; i < 2000; i++) {
            System.out.println("*****show1*****");
        }
    }
}
}

//Main函数中调用
private static void showSynchronized() {
        SynDemo sy = new SynDemo();
        new Thread(new Runnable() {
            @Override
            public void run() {
                sy.show();
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                sy.del1();
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                sy.show1();
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                sy.del();
            }
        }).start();
    }

** //synchronized,表示同步的意思
//同步可以理解成等待某一件事情结束才能开始做下一件事情
//同步:是阻塞的,就是你做了这件事情,没做完就做不了其他的事情了
//异步:就是做了一件事情没有做完就可以去做别的事情了**

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值