Java synchronized(2)

Java synchronized 关键字是将锁放在对象上的,因此同一个类不同对象,那么是不受影响的。写两个小程序来测试一下。

先记录下同一个对象的情况:

package com.lenovo.plm.dms.p4;

public class Service {
    
    private long record;
    
    public Service(long record){
        this.record = record;
    }
    synchronized public void addRecord(){
        System.out.println(Thread.currentThread().getName() + ":"+ record++);
    }
}

package com.lenovo.plm.dms.p4;

public class MyThread extends Thread{

    private Service service;
    
    public MyThread(Service service){
        this.service = service;
    }
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        for(int i = 0;i<1000;i++){
            service.addRecord();
        }
        
    }
    
}

package com.lenovo.plm.dms.p4;

public class Main {
    
    public static void main(String[] args) {
        
        Service service = new Service(0);
        
        MyThread t1 = new MyThread(service);
        t1.start();
        
        MyThread t2 = new MyThread(service);
        t2.start();
        
    }
    
}

这里两个线程,对同一个service对象进行调用,因此service中record变量是竞争资源。结果太长,因此截取其中如下:

Thread-0:1319
Thread-0:1320
Thread-0:1321
Thread-0:1322
Thread-0:1323
Thread-0:1324
Thread-0:1325
Thread-0:1326
Thread-0:1327
Thread-0:1328
Thread-1:1329
Thread-1:1330
Thread-1:1331
Thread-1:1332
Thread-1:1333
Thread-1:1334
Thread-1:1335
Thread-1:1336
Thread-1:1337
Thread-1:1338
Thread-1:1339
Thread-1:1340

可以看出两个线程是同步的。


再记录一种情况,就是两个线程操作同一个类的两个对象。

Service 类定义相同。

线程类定义如下:

package com.lenovo.plm.dms.p5;

public class MyThread extends Thread {
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        Service service = new Service(0);
        for(int i = 0;i<1000;i++){
            service.addRecord();
        }
    }
    
}


执行类定义如下:

package com.lenovo.plm.dms.p5;

public class Main {
    
    public static void main(String[] args) {
        
        MyThread t1 = new MyThread();
        t1.start();
        
        MyThread t2 = new MyThread();
        t2.start();
        
    }
    
}

两个线程分别操作两个对象。运行结果如下:

Thread-1:995
Thread-1:996
Thread-1:997
Thread-1:998
Thread-1:999
Thread-0:972
Thread-0:973
Thread-0:974
Thread-0:975
Thread-0:976
Thread-0:977
Thread-0:978
Thread-0:979
Thread-0:980
Thread-0:981
Thread-0:982
Thread-0:983
Thread-0:984
Thread-0:985
Thread-0:986
Thread-0:987
Thread-0:988
Thread-0:989
Thread-0:990
Thread-0:991
Thread-0:992
Thread-0:993
Thread-0:994
Thread-0:995
Thread-0:996
Thread-0:997
Thread-0:998
Thread-0:999

可以看出两个线程的计算结果是独立的,互相不影响。



你可能感兴趣的:(java,多线程)