概念
- 同步锁是为了保证每个线程都能正常执行原子不可更改操作,同步监听对象/同步锁/同步监听器/互斥锁的一个标记锁
- 每个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();
}
}
}