我正在包装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
修饰符。将经常调用此方法。
请提出您的意见。
答案 0 :(得分:0)
您没有为Dispatcher.processMailSending
提供任何实施,因此无法说出来。如果Dispatcher
中没有共享状态,它将是线程安全的。请注意,通过使用static
方法,您可以立即增加共享状态的可能性 - 您是否可以为每次调用实例化Dispatcher
?
然而,任何同步的影响都会大大超过将邮件发送到邮件服务器所花费的时间,我认为你们过早地进行了优化。确保您的代码是线程安全的(使用同步或其他更高级别的解决方案,如Executors
),然后担心优化。
答案 1 :(得分:0)
是的,确实如此。这是因为Dispatcher
内没有共享的可变状态。只要你不使用Dispatcher
中的静态变量本身不是线程安全的,那就没问题了。使用线程安全对象,如AtomicInteger,ConcurrentHashMap,Vectors都可以。