1:synchronized锁住类变量,一个类可以创建多个实例,实例中都是共享类变量的
package com.huan.study.mybatis.controller;
import lombok.SneakyThrows;
public class ThreadDemo {
public static void main(String[] args) {
ThreadInner threadInner01 = new ThreadInner();
ThreadInner threadInner02 = new ThreadInner();
ThreadInner threadInner03 = new ThreadInner();
threadInner01.start();
threadInner02.start();
threadInner03.start();
}
}
class ThreadInner extends Thread {
private static Integer count = 10;
@Override
@SneakyThrows
public void run() {
while (true) {
synchronized (ThreadInner.count) {
if (count <= 0) {
break;
}
System.out.println(Thread.currentThread().getName() + "**count:" + count);
count--;
}
Thread.sleep(1000);
}
}
}
synchronized (ThreadInner.count) 这样是可以锁住整个类的操作,和synchronized (ThreadInner.class)效果是一样的,如果写synchronized (this)这是锁当前实例对象,会发生并发数据不对问题
2:lock的使用
package com.huan.study.mybatis.controller;
import lombok.SneakyThrows;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ThreadDemo {
public static void main(String[] args) {
ThreadInner threadInner01 = new ThreadInner();
ThreadInner threadInner02 = new ThreadInner();
ThreadInner threadInner03 = new ThreadInner();
threadInner01.start();
threadInner02.start();
threadInner03.start();
}
}
class ThreadInner extends Thread {
private static Integer count = 10;
static Lock lock = new ReentrantLock();
@Override
@SneakyThrows
public void run() {
while (true) {
lock.lock();
if (count <= 0) {
break;
}
System.out.println(Thread.currentThread().getName() + "**count:" + count);
count--;
lock.unlock();
Thread.sleep(1000);
}
}
}