美文网首页
多线程多个锁的处理方法

多线程多个锁的处理方法

作者: 跨界师 | 来源:发表于2018-01-10 21:27 被阅读91次
v2-86939629e550076e071c2b6a16ae80ee_hd.jpg

关键字synchronized是比较常见的多线程方法,对于多线程操作某一个方法时,需要对加上synchronized来进行方法内对变量的一致性。

请看下面的代码:

package Thread;

/**
 * Created by zhangzheming on 2018/1/10.
 */

public class MultiThread {

    private int num = 0;

    public synchronized void printNum(String tag){
        try{
            if ("a".equals(tag)){
                num = 100;
                System.out.println("tag a set num end!");
                Thread.sleep(1000);
            }else {
                num = 200;
                System.out.println("tag b set num over!");
            }

            System.out.println("tag "+tag+",num= "+num);
        }catch (Exception 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();
    }
}

运行结果

不知道大家是否看出有什么问题了?
是不是两个线程没有按照先后顺序进行操作,是的,那问题在哪儿呢?

其实问题很简单,那就是m1和m2是两个线程对象,对于锁的概念是每个对象都有一把锁,也就是对于synchronized 是对象锁,而不是把一段代码当做锁,另外,两个对象,线程获取的是两个不同的锁,他们互不影响。

那怎么解决这个多线程问题呢?
其实很简单,那就是在synchronized 前使用static声明,表示锁定class类,类级别锁(独占锁)。

package Thread;

/**
 * Created by zhangzheming on 2018/1/10.
 */

public class MultiThread {

    private static int num = 0;

    public static synchronized void printNum(String tag){
        try{
            if ("a".equals(tag)){
                num = 100;
                System.out.println("tag a set num end!");
                Thread.sleep(1000);
            }else {
                num = 200;
                System.out.println("tag b set num over!");
            }

            System.out.println("tag "+tag+",num= "+num);
        }catch (Exception 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();
    }
}
运行结果

现在所有的结果就运行正确了!

下面这篇文章讲得比较详细关于synchronized
http://www.importnew.com/20444.html

相关文章

  • 多线程多个锁的处理方法

    关键字synchronized是比较常见的多线程方法,对于多线程操作某一个方法时,需要对加上synchronize...

  • ThreadLocal使用与原理

    在处理多线程并发安全的方法中,最常用的方法,就是使用锁,通过锁来控制多个不同线程对临界区的访问。 但是,无论是什么...

  • 超强解析:ThreadLocal的使用与原理,关键点都在里面

    点赞再看,养成习惯! 在处理多线程并发安全的方法中,最常用的方法,就是使用锁,通过锁来控制多个不同线程对临界区的访...

  • 方法锁、对象锁和类锁区别

    方法锁、对象锁和类锁区别 引言:结合synchronized进行分析。 synchronized用来处理多个线程同...

  • ThreadLocal原理

    在处理多下线程并发安全的方法中,最常用的方法就是使用锁,通过锁来控制多个线程对临界区的访问。但是不管什么锁,乐观锁...

  • 深入了解Synchronized同步锁的优化方法

    多线程之锁优化(上):深入了解Synchronized同步锁的优化方法 在并发编程中,多个线程访问同一个共享资源时...

  • 浅析乐观锁、悲观锁与CAS

    乐观锁与悲观锁 处理多线程并发访问最常用的就是加锁,锁又分成乐观锁和悲观锁。 悲观锁 在多线程访问共享资源时,同时...

  • 108-多线程的效率

    python的多线程有一个GIL(全局解释器锁),使得多个线程,某一时刻只有一个线程发送给CPU处理。所以多线程不...

  • C链表

    互斥锁:链表用在多线程中保证顺序,多个线程会操作同一个链表,互斥锁保证多线程操作的安全,互斥锁分情况使用,链表并不...

  • Java单例模式的各种实现方式对比

    1. 懒汉式 分析:  懒汉式给getInstance方法加上了同步锁,解决了多线程的情况下可能创建多个实例的问题...

网友评论

      本文标题:多线程多个锁的处理方法

      本文链接:https://www.haomeiwen.com/subject/lidanxtx.html