1

我正在我的系统内开发一个模块,根据某些事件,用户必须接收短信。

我有以下情况

synchronized(notificationPhoneNumber)
{
    SmsProvider.sendSms(notificationPhoneNumber, smsText);
}

sendSms 方法的代码异步运行:

public static void send(final NotificationPhoneNumber npn, final String smsText)
{
    Thread smsSender = new Thread(new Runnable()
    {
        public void run()
        {
           //sms sending code runs here....
        }

    }); 

    smsSender.start();
}

所以问题是在这种情况下,notificationPhoneNumber 对象锁定了多长时间?它是否会在线程完成其工作时被锁定?

4

2 回答 2

3

只要

 SmsProvider.sendSms(notificationPhoneNumber, smsText);

不回来。这意味着,您的sendsms()方法将创建一个线程并返回。就为了那段时间。

此外,如果您在方法中启动线程。创建的线程将只保存引用而不是返回后的锁sendsms()

锁和同步是外部的sendsms()。无论哪个线程调用sendsms() 都将获取锁,并且其中的代码sendsms()对此一无所知。

于 2013-09-04T09:39:01.370 回答
1
synchronized(notificationPhoneNumber){
    ...
}

这里NotificationPhoneNumber对象将被锁定,直到执行同步块,一旦执行结束,线程将释放该对象的锁。

同步语句代表执行线程获取互斥锁(第 17.1 节),执行块,然后释放锁。当执行线程拥有锁时,没有其他线程可以获取锁。

阅读有关文档的更多信息

于 2013-09-04T09:38:15.610 回答