package cn.bufanli.test;
/**
* 关键字 synchronized 关键字取得的锁都是对象锁,而不是一段代码(方法) 当做锁
* 所以代码中哪个线程synchronized关键字的方法 哪个线程就持有该方法所属对象的锁(lock)
*多线程多个锁:多个线程每个线程都可以拿到自己指定的锁.分别获得锁之后,执行synchronized方法体的内
*容
* 在静态方法上加synchronized 关键字,表示锁定.class类 类一级别的锁(独占.class类)
* 类级别的锁:创建多个对象,多个对象持有的锁是1把;
* 方法级别锁,创建多个对象,多个对象各持有1把锁
*/
public class MultiThread {
/**
* 变量上加static 关键字保证数据的原子性
*/
private static int num = 0;
/**
* 方法上加 static 是类锁
* @param tag
*/
private synchronized void printNum(String tag){
try {
if(tag.equals("a")){
num = 100;
System.out.println("tag a ,set num over!");
Thread.sleep(1000);
}else{
num = 200;
System.out.println("tag b ,set num over!");
}
System.out.println("tag:" + tag + "num:" + num);
}catch (Exception e){
}
}
/**
* 注意主函数run方法的执行顺序
* @param args
*/
public static void main(String[] args) {
//两个不同的对象
MultiThread multiThread = new MultiThread();
MultiThread multiThread2 = new MultiThread();
Thread thread = new Thread(() -> {
multiThread.printNum("a");
});
Thread thread2 = new Thread(() -> {
multiThread2.printNum("b");
});
thread.start();
thread2.start();
/*Thread thread = new Thread(new Runnable() {
@Override
public void run(){
multiThread.printNum("a");
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run(){
multiThread2.printNum("b");
}
});
thread.start();
thread2.start();*/
}
}