竞争条件可能吗?

时间:2013-01-30 09:56:05

标签: java thread-safety

我正在包装java邮件传输类并调用我的方法来处理发送邮件的有效地址。

传输课程

 public class Transport  extends javax.mail.Transport {

private static final String  CLASSNAME = Transport.class.getName();

private static final Logger LOGGER = Logger.getLogger(CLASSNAME);


public Transport(Session session, URLName urlname) {
    super(session, urlname);
}

@Override
public void sendMessage(Message msg, Address[] addresses) throws MessagingException {
    Dispatcher.processMailSending(msg,addresses);
    send(msg,addresses);
}

public static void send(Message msg , Address[] addresses) throws MessagingException{
    Dispatcher.processMailSending(msg,addresses);
    javax.mail.Transport.send(msg,addresses);
}

public static void send(Message msg) throws MessagingException{
    Dispatcher.processMailSending(msg);
    javax.mail.Transport.send(msg);
}

}

调度程序类

  public class Dispatcher{
       public static void processMailSending(Message msg , Address[] address){
           Validator v = new Validator();
           v.validate();
       }

       public static void processMailSending(Message msg) throws MessagingException{
           Validator v = new Validator();
           v.validate();
             //TOD: do validation
       }
  }

 class Validator{
      private Message msg;
      private Address[] address;

      public Validator(Message msg , Address address){
             this.msg = msg;
             this.address = address;
      }

      public void validate(){
          checkSpam(msg.getFrom());
      }
 }

我读过oracle论坛帖子。他们说Transport.send是线程安全的。

https://forums.oracle.com/forums/thread.jspa?threadID=1589778&tstart=2865

我的问题

Dispatcher.processMailSending线程安全吗?

我避免在syncrhonized中使用processMailSending修饰符。将经常调用此方法。

请提出您的意见。

2 个答案:

答案 0 :(得分:0)

您没有为Dispatcher.processMailSending提供任何实施,因此无法说出来。如果Dispatcher中没有共享状态,它将是线程安全的。请注意,通过使用static方法,您可以立即增加共享状态的可能性 - 您是否可以为每次调用实例化Dispatcher

然而,任何同步的影响都会大大超过将邮件发送到邮件服务器所花费的时间,我认为你们过早地进行了优化。确保您的代码是线程安全的(使用同步或其他更高级别的解决方案,如Executors),然后担心优化。

答案 1 :(得分:0)

是的,确实如此。这是因为Dispatcher内没有共享的可变状态。只要你不使用Dispatcher中的静态变量本身不是线程安全的,那就没问题了。使用线程安全对象,如AtomicInteger,ConcurrentHashMap,Vectors都可以。