Это выглядит корректным мне. Если бы я должен был изменить что-нибудь, то я прекратил бы использовать Collections.synchronizedMap () и синхронизировал бы все тот же путь, только для создания его более ясным.
кроме того, я заменил бы
if (synchronizedMap.containsKey(key)) {
synchronizedMap.get(key).add(value);
}
else {
List<String> valuesList = new ArrayList<String>();
valuesList.add(value);
synchronizedMap.put(key, valuesList);
}
с
List<String> valuesList = synchronziedMap.get(key);
if (valuesList == null)
{
valuesList = new ArrayList<String>();
synchronziedMap.put(key, valuesList);
}
valuesList.add(value);
После некоторого времени поиска и тестирования я нашел «исправление / ответ», хотя это не совсем то, на что я надеялся. Выполнение запроса через реестр, по-видимому, единообразно для всех версий, которые у меня есть в моей лаборатории для Win2k3 и Win2k8. Вот откуда я беру информацию:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment
KEY: PROCESSOR_ARCHITECTURE
Отображает x86 или AMD64. Это не идеально, но, по крайней мере, он каждый раз дает мне правильный ответ.
Тем не менее, если кто-то знает согласованный ключ «Класс» или реестра, который будет выводить 32/64, 32-бит / 64-бит или X86 / X64, я был бы очень признателен за информацию.
Простой запрос WMI, который вы использовали, действительно возвращает результат для каждого физического процессора в компьютере. Он вернет только один результат, если у вас однопроцессорный, многоядерный процессор. Мы можем с уверенностью предположить, что в компьютере есть как минимум один процессор, поэтому мы просто используем информацию из CPU0.
Чтобы выбрать только 64-битные операционные системы...
select * from Win32_Processor where DeviceID="CPU0" and AddressWidth="64"
Чтобы выбрать только 32-битные операционные системы...
select * from Win32_Processor where DeviceID="CPU0" and AddressWidth="32"
В VBS:
On Error Resume Next
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT * FROM Win32_Processor", "WQL", _
wbemFlagReturnImmediately + wbemFlagForwardOnly)
For Each objItem In colItems
WScript.Echo "AddressWidth: " & objItem.AddressWidth
Next