java并发编程--synchronized关键字

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();*/


    }
}

猜你喜欢

转载自blog.csdn.net/adminBfl/article/details/102866420