Plusieurs threads peuvent partager (accéder) à la même ressource
Par exemple, accéder au même objet, à la même variable, au même fichier
Lorsque plusieurs threads accèdent à la même ressource, il est facile de provoquer une confusion dans les données et des problèmes de sécurité des données, appelés problèmes de sécurité des threads
Dans quelles circonstances des problèmes de sécurité des threads se produiront
Plusieurs threads partagent la même ressource
Et au moins un thread effectue une opération d'écriture
Il y a deux fils de discussion pour déposer de l'argent et retirer de l'argent respectivement
1000-1-----»999Déposer de l'argent Retirer de l'argent Fil de discussion 1 Solde Fil de discussion 2
1000 «----1000------» 1000
1000 "----1000------" 1000
1000+1000--- - -》2000
Vendre des billets
Sujet 1 Nombre de votes Sujet 2
999 «-----1000 -1
Correct : fin Le solde final doit être de 998, et non de 999Erreur de problème d'achat de ticket (pas de thread synchronisé) Exemple :public class love implements Runnable{ private int piao=3000;//有3000张票 public boolean sale() {//ture代表还有票;false代表没有票了 if(piao<1) return false; piao--;//卖1张票 //细化piao--; //寄存器=piao; //寄存器=寄存器-1; //piao=寄存器; String sk =Thread.currentThread().getName();//获取当前线程(买票窗口)的名字 System.out.println(sk+"卖了1张票,还剩下"+piao+"张"); return piao>1; } public void run() { while(sale());//循环执行;直至卖完票返回false } } public class Main { public static void main(String[] a) { love tjlove =new love(); for(int i=1;i<=4;i++) {//循环4次;产生4个线程(窗口)卖票 Thread tj = new Thread(tjlove()); tj.setName(""+i); tj.start(); } } }Copier après la connexionRésultat de sortie partielle :
Problème de sécurité du thread
Problème d'analyse
Les threads A et B dans la valeur de la variable de classe 1 sont 17 pour l'opération +1
Le résultat final est 2 18SolutionVerrouillage :
Cela peut garantir qu'un seul thread y accède en même temps, garantissant ainsi la sécurité ; l'erreur précédente était due au fait que ces threads y accédaient ensemble
La synchronisation des threads a deux méthodes en Java :
1 Déclaration de synchronisation
public class love implements Runnable{ private int piao=3000;//本人cpu单核性能过强,数据量大些才能看到是4个线程在卖票 public boolean sale() { synchronized(this) {//1个线程获取这个对象的锁,并加锁; synchronized作用于整个语句 //this指向当前对象 //不能用new Object();这样会产生新的对象,产生新的锁 //把this换成"123",效果基本一样;因为其存在常量值里,每次访问的对象一样 if(piao<1) return false; piao--; String sk =Thread.currentThread().getName(); System.out.println(sk+"卖了1张票,还剩下"+piao+"张"); return piao>0; } } public void run() { while(sale()); } }
Le principe de synchroniser(obj)
1. Chaque objet est associé à un verrou intrinsèque (verrouillage intrinsèque) ou à un verrou de moniteur (verrouillage du moniteur)
3 Tant qu'un thread détient le verrou interne, les autres threads ne pourront plus obtenir ce verrou en même temps
. ✓ Lorsqu'ils tentent d'acquérir ce verrou, ils entreront dans l'état BLOQUÉ
4. Lorsque plusieurs threads accèdent à la même instruction synchronisée (obj)obj doit être le même objet pour réaliser la synchronisationMéthode de synchronisationpublic class love implements Runnable{ private int piao=3000; public synchronized boolean sale() { //synchronized作用于整个方法 if(piao<1) return false; piao--; String sk =Thread.currentThread().getName(); System.out.println(sk+"卖了1张票,还剩下"+piao+"张"); return piao>0; } public void run() { while(sale()); } }
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!