多线程在任何语言中都有介绍,多线程共享一份资源,因此要操作一个变量时,必须为变量加上一个锁,虽然这样影响了效率,只能一个线程来操作该变量,其他线程只能等到该线程释放锁后,获得锁,才能操作变量。在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中的操作,如果我们改成这样
那又又两个对象了,和上面一样,只有一个线程竞争,所以不用等待,运行如下:
各自运行,各不相干。
总结:被锁住的只能有一份,需要多个线程来抢才能发挥锁的作用,如果是静态方法,锁不锁都可以,因为只有一份拷贝。