线程并发四:线程安全之synchronized

来源:互联网 发布:小学生网络教学 编辑:程序博客网 时间:2024/06/05 06:26

关键字synchronized 的作用是实现线程间的同步,他的工作是对同步的代码加锁,使得每一次,只能有一个线程进入同步块,从而保证线程间的安全性。

关键字synchronized可以有多种用法。这里做简单的整理
a.指定加锁对象
b.直接作用于实例方法
c.直接作用于静态方法

用法很简单,这里就不举例说明了,下面列举一个很常见的错误同步用法

import java.util.Date;public class SyncThreadTest implements Runnable {    public synchronized void sayHello(){        System.out.println("[" + new Date().getTime() + "]" + Thread.currentThread().getName() + ": say hello!!");        try {            Thread.sleep(1000);        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }    public void run(){        while(true){            sayHello();        }    }    public static void main(String[] args){        Thread t1 = new Thread(new SyncThreadTest(),"test1");        Thread t2 = new Thread(new SyncThreadTest(),"test2");        t1.start();        t2.start();    }}

可以看出两个线程指向了不同的Runable实例,换而言之,两个线程使用了两把不同的锁,因此无法保证线程安全。
但是我们只需简单的修改,就可以正确运行,那就是直接作用于静态方法,这样修改之后,两个线程请求的锁则变为当前类的锁,而非实例的锁。

    public static synchronized void sayHello(){        System.out.println("[" + new Date().getTime() + "]" + Thread.currentThread().getName() + ": say hello!!");        try {            Thread.sleep(1000);        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }