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

关键字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();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值