On souhaite créer deux threads qui change le même un champs d'un même objet :
public class Test {
int value;
public static void main(String[] args) {
final Test test=new Test();
for(int i=0;i<2;i++) {
final int id=i;
new Thread(new Runnable() {
public void run() {
for(;;) {
test.value=id;
if (test.value!=id)
System.out.println("id "+id+" "+test.value);
}
}
}).start();
}
}
}
On souhaite écrire une version thread-safe de méthode strtok qui :
Voici le code :
public static CharSequence strtok(CharSequence input,char delimiter) {
int offset;
if (input==null) {
input=lastInput;
if (input==null)
return null;
offset=lastOffset;
}
else {
lastInput=input;
offset=0;
}
for(int i=offset;i<input.length();i++) {
if (input.charAt(i)==delimiter) {
lastOffset=i+1;
return input.subSequence(offset,i);
}
}
lastInput=null;
return input.subSequence(offset, input.length());
}
private static CharSequence lastInput;
private static int lastOffset;
et un exemple :
CharSequence seq1=strtok("toto est beau",' '); // toto
CharSequence seq2=strtok(null,' '); // est
CharSequence seq3=strtok(null,' '); // beau
CharSequence seq4=strtok(null,' '); // null
On souhaite écrire une implantation de liste chaînée concurrente
n'utilisant ni section critique ni verrou.
La liste devra possèder deux méthodes addLast(E e)
et toString() permettant respectivement
d'ajouter un élement en queue de liste et d'afficher la liste.
Lors de la création, la liste sera créée avec un maillon.
L'idée pour éviter toutes synchronizations lors de
l'ajout consiste à récuperer le maillon à la fin de la liste
puis à tester en une opération atomique si le maillon
est toujours la fin de la liste et si oui à lui assigner
le nouveau maillon créé. Si ce n'est pas le dernier maillon,
on récupère de nouveau la fin de la liste
et l'on recommence le même algorithme.
Dans un premier temps, nous allons définir la liste comme contenant juste un élement ainsi qu'une référence sur un autre élement de la liste. L'ajout à la fin de la liste se fera par un parcours du chaînage.