Maison > Java > javaDidacticiel > 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

青灯夜游
Libérer: 2018-10-22 17:45:27
avant
5507 Les gens l'ont consulté

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;
		}
	}
}
Copier après la connexion

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!

Étiquettes associées:
source:csdn.net
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal