0

我正在包装 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安全吗?

我避免syncrhonizedprocessMailSending. 这个方法会被频繁调用。

请提出您的意见。

4

2 回答 2

0

您没有提供任何实现,Dispatcher.processMailSending因此无法说。如果Dispatcher. 请注意,通过使用static方法,您立即增加了共享状态的可能性——您可以Dispatcher为每个调用实例化 a 吗?

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

于 2013-01-30T09:58:46.750 回答
0

是的。这是因为没有共享的、可变的状态在Dispatcher. 只要您不在其中使用静态变量Dispatcher,它本身就不是线程安全的,那么就可以了。AtomicInteger、ConcurrentHashMap、Vectors 等线程安全对象的使用很好。

于 2013-01-30T09:59:21.400 回答