java同步锁的简单使用
概念
- 同步锁是为了保证每个线程都能正常执行原子不可更改操作,同步监听对象/同步锁/同步监听器/互斥锁的一个标记锁
- 每个Java对象都有且只有一个同步锁,在任何时刻,最多只允许一个线程拥有这把锁,当消费者线程试图执行以带有synchronized(this)标记的代码块时,消费者线程必需先获得this关键字引用的Stack对象的锁
目的:为了保证共享数据在同一时刻只被一个线程使用
- 在共享数据里保存一个锁 ,当没有线程访问时,锁是空的。
- 当有第一个线程访问时,就 在锁里保存这个线程的标识 并允许这个线程访问共享数据。
- 在当前线程释放共享数据之前,如果再有其他线程想要访问共享数据,就要等待锁释放 。
分类
对象锁(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(); } } }