Java synchronized(2)

来源:互联网 发布:c语言字符串如何结束 编辑:程序博客网 时间:2024/06/15 10:50

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

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



0 0
原创粉丝点击