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();
        }
    }
}
经验分享 程序员 微信小程序 职场和发展