0

为什么以下代码线程不安全以及如何修复它?

public abstract class BaseResponseHandler extends AsyncHttpResponseHandler {
    private static XmlPullParserFactory xmlPullParserFactory;

    public static synchronized XmlPullParser newPullParser(String input) throws XmlPullParserException {
        if (xmlPullParserFactory == null) {
            xmlPullParserFactory = XmlPullParserFactory.newInstance();
        }

        final XmlPullParser parser = xmlPullParserFactory.newPullParser();
        parser.setInput(new StringReader(input));
        return parser;
    }
}
4

1 回答 1

0

两种可能的方式:

1)在每次调用时创建多个实例。它很昂贵,但由于它不是线程安全的,因此这是一种选择

XmlPullParserFactory xmlPullParserFactory = XmlPullParserFactory.newInstance();
final XmlPullParser parser = xmlPullParserFactory.newPullParser();
parser.setInput(new StringReader(input));

2)创建一个实例,并在每次同步下使用它来创建不同的解析器。

XmlPullParser parser = null;
synchronized(xmlPullParserFactory) {
   parser = xmlPullParserFactory.newPullParser();
}

在高并发下,选项 1 比选项 2 快得多。我建议您使用选项 1。

于 2016-02-05T07:21:07.580 回答