是两个锁,a锁和b锁
多线程的运行容易出现问题
问题的原因:
当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完
另一个线程参与进来执行,导致共享数据的错误
解决办法:
对多条操作共享数据的语句,只能让一个线程都执行完;在执行的过程中,其他线程不可以参与执行
java对于多线程的安全问题提供了专业的解决方式
就是同步代码块
synchronized(对象)
{
需要被同步的代码;
}
同步的前提:
1,必须有两个或两个以上的线程
2,必须是多个线程使用同一个锁
必须保证同步中只能有一个线程运行
好处:解决多线程的安全问题
弊端:多个线程都需要判断锁,较为消耗资源
在同步中嵌套同步,会出现死锁,如:
- class Test implements Runnable{
- private boolean flag;
- Test(boolean flag){
- this.flag = flag;
- }
- public void run(){
- if(flag){
- synchronized(MyLock.locka){
- System.out.println("if locka");
- synchronized(MyLock.lockb){
- System.out.println("if lockb");
- }
- }
- }
- else{
- synchronized(MyLock.lockb){
- System.out.println("else lockb");
- synchronized(MyLock.locka){
- System.out.println("else locka");
- }
- }
- }
- }
- }
- MyLock{
- static Object locka = new Object();
- static Object lockb = new Object();
- }
- class LoackTest{
- public static void main(String[] args){
- Thread t1 = new Thread(new Test());
- Thread t2 = new Thread(new Test());
- }
- }
复制代码
|