Maison  >  Article  >  Java  >  Comment implémenter un compteur thread-safe en Java ? Comment implémenter des compteurs thread-safe

Comment implémenter un compteur thread-safe en Java ? Comment implémenter des compteurs thread-safe

青灯夜游
青灯夜游avant
2018-10-22 17:42:425435parcourir

Ce que cet article vous apporte, c'est comment implémenter un compteur thread-safe en Java ? Comment implémenter un compteur thread-safe. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il vous sera utile.

  • Introduction au principe de mise en œuvre des compteurs thread-safe :
    Le mot clé volatile en Java peut assurer la visibilité des données partagées, il mettra à jour les données Actualisez la mémoire de travail dans la mémoire partagée, invalidez les données de la mémoire de travail dans d'autres threads, puis lisez la dernière valeur de la mémoire principale pour garantir la visibilité des données partagées. Le compteur thread-safe est implémenté via des opérations CAS cycliques. . Il s'agit d'abord d'obtenir une ancienne valeur attendue, puis de comparer si la valeur obtenue est cohérente avec la valeur dans la mémoire principale, si elle est cohérente, si elle est incohérente, continuez à boucler jusqu'à succès. 🎜>

  • Implémentation de code spécifique

Résultats d'exécution :
public class Count{
	private int count = 0;
	private AtomicInteger atomicI = new AtomicInteger(0);
	public static void main(String[] args){
		final Count cas = new Count();
		List<Thread> list = new ArrayList<Thread>();
		long start = System.currentTimeMillis();
		for(int j=0;j<100;j++){
			Thread t = new Thread(new Runnable(){
				@Override
				public void run(){
					for(int i=0;i<1000;i++){
						cas.count();
						cas.safeCount();
					}
				}
			});
			list.add(t);
		}
		//启动线程
		for(Thread t:list){
		t.start();
		}
		//等待所有线程执行完毕
		for(Thread t:list){
			try{
				t.join();
				}catch(Exception e){
				e.printStackTrace();
				}
		}
		System.out.println("线程不安全:"+cas.count);
		System.out.println("线程安全:"+cas.atomicI.get());
		System.out.println("耗时:"+(System.currentTimeMillis() - start));
	}
	/**线程不安全的计数器*/
	public void count(){
		count++;
	}
	/**线程安全的计数器,循环CAS*/
	public void safeCount(){
		for(;;){
			int temp = atomicI.get();
			if(atomicI.compareAndSet(temp,++temp))
			  break;
		}
	}
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer