多个线程多个锁

多个线程多个锁:多个线程,每个线程都可以拿到自己指定的锁,分别获得锁之后,执行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).

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容