java同步锁的简单使用

概念

  1. 同步锁是为了保证每个线程都能正常执行原子不可更改操作,同步监听对象/同步锁/同步监听器/互斥锁的一个标记锁
  2. 每个Java对象都有且只有一个同步锁,在任何时刻,最多只允许一个线程拥有这把锁,当消费者线程试图执行以带有synchronized(this)标记的代码块时,消费者线程必需先获得this关键字引用的Stack对象的锁

目的:为了保证共享数据在同一时刻只被一个线程使用

  1. 在共享数据里保存一个锁 ,当没有线程访问时,锁是空的。
  2. 当有第一个线程访问时,就 在锁里保存这个线程的标识 并允许这个线程访问共享数据。
  3. 在当前线程释放共享数据之前,如果再有其他线程想要访问共享数据,就要等待锁释放 。

分类

对象锁(this)
类锁(类的字节码文件对象即类名.class)
字符串锁(比较特别)

测试案例

MyThread.java

public class MyThread implements Runnable {
    @Override
    public void run() {
        synchronized (Thread.currentThread().getName()){//使用字符串锁
        //synchronized (this) { //使用this对象锁
        //synchronized (MyThread.class){ //使用MyThread.class类锁
            System.out.println(Thread.currentThread().getName() + "-开始");
            try {
                Thread.sleep(30000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "-结束");
        }
    }
}

Test.java

public class Test{
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        Thread thread = null;
        for (int i = 1; i <= 5; i++) {
            thread = new Thread(myThread, "线程" + i); //开启5个线程,传入同一个对象
            thread.start();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值