Java 多线程(PART IX) synchronized(II) 对对象进行加锁

来源:互联网 发布:淘宝自动装修软件 编辑:程序博客网 时间:2024/05/12 16:54

此代码用于证明线程锁的是对象:

示例代码:

package a;class MyObject{    public void methodA() {        try {            System.out.println("begin methodA threadName="+Thread.currentThread().getName());            Thread.sleep(5000);            System.out.println("end");        } catch (InterruptedException e) {            e.printStackTrace();        }    }}class Thread_OA extends Thread{    private MyObject object;    public Thread_OA(MyObject object) {        this.object=object;    }    @Override    public void run() {        this.object.methodA();    }}class Thread_OB extends Thread{    private MyObject object;    public Thread_OB(MyObject object) {        this.object=object;    }    @Override    public void run() {        this.object.methodA();    }}public class SynTest3 {    public static void main(String[] args) {        MyObject object=new MyObject();        Thread_OA oa=new Thread_OA(object);        oa.setName("A");        Thread_OB ob=new Thread_OB(object);        ob.setName("B");        oa.start();        ob.start();    }}

在上面这段代码中没有对方法进行加锁。

输出结果:

begin methodA threadName=Bbegin methodA threadName=Aendend

结果分析:

可以看到一共有两个线程同时在执行 methodA方法。因为没有对象methodA添加synchronized关键字。

对象methodA方法添加synchronized

synchronized public void methodA() {        try {            System.out.println("begin methodA threadName="+Thread.currentThread().getName());            Thread.sleep(5000);            System.out.println("end");        } catch (InterruptedException e) {            e.printStackTrace();        }    }

修改后的代码如上

输出结果

begin methodA threadName=Aendbegin methodA threadName=Bend

结果分析

可以看到,此时两个线程没有同时进入methodA方法,也就是在线程A持有对象的lock锁的情况下,B线程如果想执行methodA方法则需要等待。

阅读全文
0 0
原创粉丝点击