Java >> Java tutorial >  >> Java

Trådinterferens i Java - Dagens Java-koncept

Multithreading har sine egne fordele og ulemper. Den største fordel ved multithreading er, at vi kan udføre flere opgaver samtidigt. Samtidig er det en udfordring for softwareudviklere at beskytte den hukommelse, som tråden læser eller skriver i. Der er ikke noget problem, når flere tråde har deres egen hukommelse. Hver tråd læser eller skriver i deres egen hukommelse. Der er en udfordring, når flere tråde deler samme hukommelse. Hver tråd vil læse eller skrive i samme hukommelse. Dette skaber inkonsistente data i hukommelsen. For eksempel,

Hvis en tråd læser en hukommelse, mens en anden tråd skriver ind i den, hvilken værdi vil den første tråd ender med at læse? er det den gamle værdi eller værdi skrevet af den anden tråd? Hvis to tråde skriver ind i samme hukommelse, hvilken værdi vil så blive gemt i den hukommelse? er det værdi skrevet af den første tråd eller værdien skrevet af den anden tråd? Spørgsmål som disse vil opstå, når flere tråde deler samme hukommelse. Trådinterferens er også en af ​​dem.

Trådinterferens i java er en tilstand, der opstår, når mere end én tråd, der køres samtidigt, får adgang til samme stykke data. Når mere end én tråd har adgang til samme data, er det muligt, at data kan blive beskadiget, eller man kan ikke få det ønskede output. Trådinterferens opstår, når kode skrevet ikke er trådsikker .

Overvej nedenstående program. Dette program er ikke trådsikkert.

class Shared
{
	int i;

	void SharedMethod()
	{
		i = 10;
		System.out.println(i);
		i = 20;
		System.out.println(i);
		i = 30;
		System.out.println(i);
	}
}

public class ThreadsInJava
{
	public static void main(String[] args)
	{
		final Shared s1 = new Shared();

		Thread t1 = new Thread()
		{
			@Override
			public void run()
			{
				s1.SharedMethod();
			}
		};

		Thread t2 = new Thread()
		{
			@Override
			public void run()
			{
				s1.SharedMethod();
			}
		};

		t1.start();

		t2.start();
	}
}

I ovenstående eksempel er der to tråde, nemlig t1 og t2, og de bruger det samme Shared class-objekt s1. Både t1 og t2 kalder sharedMethod() af s1-objektet fra deres run()-metode. Da vi starter tråd t1 først, lad os antage, at tråd t1 udfører den sidste sætning af sharedMethod() (Linje 12), og tråd t2 er færdig med at udføre den første sætning af sharedMethod() (Linje 7). Mens den sidste sætning udføres, vil tråd t1 forvente værdien "i" som 30, da den har tildelt den 30 i den forrige sætning (linje 11), men t2 har ændret værdien af ​​"i" til 10, mens den udfører den første sætning. Så t1 vil læse værdien af ​​"i" som 10 ikke 30, som den forventes.

Dette er et eksempel på trådinterferens . Trådinterferens opstår, når en række trin af mere end én tråd overlapper hinanden. Du kan følge Oracle-dokumentationen om trådinterferens her. Ovenstående eksempel kan beskrives med diagrammet som nedenfor.

Hvordan undgår man trådinterferens eller hvordan man opnår trådsikkerhed?

Følgende er nogle metoder, der bruges til at undgå trådinterferens i java.(Disse metoder vil blive diskuteret i detaljer i efterfølgende artikler).

  • Ved at erklære metoden som synkroniseret.
  • Ved at erklære variablerne som endelige.
  • Ved at erklære variablen som flygtig.
  • Ved at oprette de uforanderlige objekter.
  • Ved at bruge Atomic-operationer.
  • Ved at begrænse adgangen til det samme objekt med flere tråde.

Java tag