多个线程多个锁

多个线程多个锁:多个线程,每个线程都可以拿到自己指定的锁,分别获得锁之后,执行synchronized方法体的内容。
如下代码:

package com.airycode.base.sync002;

/**
 * 关键字synchronized取得的锁都是对象锁,而不是把一段代码(方法)当做锁
 * 所以代码中哪个线程先执行synchronized关键字的方法,哪个线程就持有该方法所属对象的锁(Lock)
 * 在静态方法上加synchronized关键字,表示锁定.class类,类一级别的锁(独占.class)
 * @author admin
 *
 */

public class MultiThread {

    /**static*/
    private static int num = 0;
    
    public static 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 (InterruptedException e) {
            e.printStackTrace();
        }
        
        
    }
    
    public static void main(String[] args) {
        /**两个不同的对象*/
        final MultiThread m1 = new MultiThread();
        final MultiThread m2 = new MultiThread();
        
        Thread t1 = new Thread(new Runnable(){
            @Override
            public void run() {
                m1.printNum("a");
            }
        });
        Thread t2 = new Thread(new Runnable(){
            @Override
            public void run() {
                m2.printNum("b");
            }
        });
        
        t1.start();
        t2.start();
        
    }
    
    
}

运行结果:


image.png

实例总结:
关键字synchronized取得的锁都是对象锁,而不是把一段代码(方法)当做锁,所以实例代码中那个线程先执行synchronized关键字的方法,那个线程就持有该方法所属对象的锁(Lock),两个对象,线程获得的就是两个不同的锁,他们互不影响。
有一种则是相同的锁,即在静态方法上加synchronized关键字,表示锁定.class类,类一级别的锁(独占.class).

你可能感兴趣的:(多个线程多个锁)