Classe
Sous le package java.util.concurrent.atomic, il y a AtomicBoolean, AtomicInteger, AtomicLong, AtomicReference et d'autres classes, leurs de base La caractéristique est que dans un environnement multithread, lors de l'exécution des méthodes contenues dans ces instances de classe, elle est exclusive, c'est-à-dire que lorsqu'un thread entre dans la méthode et exécute les instructions qu'elle contient, il ne sera pas interrompu par d'autres threads. , et les autres threads tourneront simplement. De la même manière que le verrou, il attend que la méthode soit terminée avant que la JVM sélectionne un autre thread dans la file d'attente pour y entrer.
Exemple
Prenons AtomicBoolean comme exemple Si un seul thread exécute une méthode ordinaire (comme suit), il n'y aura pas de problème de thread :
package com.secbro.test.atomic; /** * @author zhuzhisheng * @Description * @date on 2016/5/26. */ public class NormalBoolean implements Runnable{ public static boolean exits = false; private String name; public NormalBoolean(String name){ this.name = name; } @Override public void run() { if(!exits){ exits = true; System.out.println(name + ",step 1"); System.out.println(name + ",step 2"); System.out.println(name + ",step 3"); exits = false; } else { System.out.println(name + ",step else"); } } public static void main(String[] args) { new NormalBoolean("张三").run(); } }
package com.secbro.test.atomic; /** * @author zhuzhisheng * @Description * @date on 2016/5/26. */ public class NormalBoolean2 implements Runnable{ public static boolean exits = false; private String name; public NormalBoolean2(String name) { this.name = name; } @Override public void run() { if(!exits){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } exits = true; System.out.println(name + ",step 1"); System.out.println(name + ",step 2"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(name + ",step 3"); exits = false; } else { System.out.println(name + ",step else"); } } }
张三,step 1 李四,step 1 张三,step 2 李四,step 2 张三,step 3 李四,step 3
package com.secbro.test.atomic; import java.util.concurrent.atomic.AtomicBoolean; /** * @author zhuzhisheng * @Description * @date on 2016/5/26. */ public class TestAtomicBoolean implements Runnable{ public static AtomicBoolean exits = new AtomicBoolean(false); private String name; public TestAtomicBoolean(String name) { this.name = name; } @Override public void run() { if(exits.compareAndSet(false,true)){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(name + ",step 1"); System.out.println(name + ",step 2"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(name + ",step 3"); exits.set(false); } else { System.out.println(name + ",step else"); } } }
张三,step else 李四,step 1 李四,step 2 李四,step 3
package com.secbro.test.atomic; /** * @author zhuzhisheng * @Description * @date on 2016/5/26. */ public class TestBoolean { public static void main(String[] args) { Thread thread1 = new Thread(new NormalBoolean2("李四")); Thread thread2 = new Thread(new NormalBoolean2("张三")); thread1.start(); thread2.start(); //------------------------------------------------------- Thread thread3 = new Thread(new TestAtomicBoolean("李四")); Thread thread4 = new Thread(new TestAtomicBoolean("张三")); thread3.start(); thread4.start(); } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!