• java中synchronized关键字


    多线程在任何语言中都有介绍,多线程共享一份资源,因此要操作一个变量时,必须为变量加上一个锁,虽然这样影响了效率,只能一个线程来操作该变量,其他线程只能等到该线程释放锁后,获得锁,才能操作变量。在python里面有threading.Lock()来生成锁,利用acquire(),release(),来释放锁,java中利用关键字synchronized来锁住变量.

    1.锁住方法

    调用如下:

    两个线程t1,t2都同时调用了a对象的run方法,但是run方法上了锁,所有同一时刻只能被一个线程调用,运行如下:

    t1先获得锁,完成后释放锁,再被t2获得锁,调用run方法,但是如果改成如下,结果会怎么样呢?

     t1和t2分别调用了不同对象的run方法,虽然run方法都上了锁,但是各个对象都只有一个线程竞争资源,所有两个线程或不干扰,各自运行

    没有达到我们上锁的目的,因此得出结论,被锁定的方法只能有一份拷贝,需要多个线程竞争。

    2.锁变量

     锁定变量的格式如下:

    synchronized(被锁定的变量){

      操作。。。。

    }

    调用如下

    运行:

    锁定的是当前对象this,就是我们传入的对象a,因为只有一个a,所有t2需要等待t1释放锁后才能调用syncronized中的操作,如果我们改成这样

    那又又两个对象了,和上面一样,只有一个线程竞争,所以不用等待,运行如下:

    各自运行,各不相干。

    总结:被锁住的只能有一份,需要多个线程来抢才能发挥锁的作用,如果是静态方法,锁不锁都可以,因为只有一份拷贝。

  • 相关阅读:
    Linux
    Python
    Linux
    Python
    爬虫
    WEB
    法正(13):密谋
    法正(12):张松
    法正(11):入川
    法正(10):袍哥
  • 原文地址:https://www.cnblogs.com/diwangguilai/p/10529834.html
Copyright © 2020-2023  润新知