2013-05-11 2 views
0

Я пишу инструменты профилирования пути, и я использую jdt Astparser для изменения исходного кода Если я хочу добавить некоторые коды после каждой исходной строки и позволить им быть атомарными и не изменять поведение исходного кода. не только как этот: исходного код:Обработка исходного кода (добавление синхронизированного блока) изменяет область видимости переменной

int a = 0; 
int b = 0; 
a = b; 

после манипуляции

synchronized (lock) { 
int a = 0; //original code 
//my code 
//.... 
//end 
} 
synchronized (lock) { 
int b = 0; //original code 
//my code 
//.... 
//end 
} 
synchronized (lock) { 
a = b; //original code 
//my code 
//.... 
//end 
} 

но он изменяет переменные сферы, переменные а и б больше не глобальные и код не может скомпилировать.

Есть ли способ объединить объявление переменной и коды, которые я вставил после этого, чтобы они стали атомарными и не изменяли область переменных?

... и извините за мой английский :)

+1

Если вы не хотите, чтобы они находились в области действия блока, не объявляйте их в блоке. –

+0

Я хочу, чтобы объявление переменной и код i вставили после атомной операции, поэтому он должен находиться в блоке – kaze13

+0

@Brian Roach, см. Выше. – kaze13

ответ

1

Не объявляйте их в блоке. Это не имеет никакого отношения к самой инициализации.

int a, b; 

synchronized (lock) { 
    a = 0; 
} 
synchronized (lock) { 
    b = 0; 

} 
synchronized (lock) { 
    a = b; 
} 

Я не уверен, почему вы используете три synchronized блоков, хотя, если код не является гораздо более сложным, чем ваш пример показывает.

+0

На самом деле я хочу добавить код после «int a, b;» и они должны быть атомами – kaze13

+0

Запись 'int a, b;' просто объявляет их в текущей области. Вы можете получить к ним доступ из ваших «синхронизированных» блоков и выполнять любые операции, которые вы хотите. – sapi

Смежные вопросы