What is thread security first? Java Memory Model: A simple understanding is to copy data from the system memory to the jvm's working memory-> process variables in the jvm memory-> write data back to the system memory after jvm processing is complete. For example, the following operation is: copy I from the system memory to the working memory> Add I in the working memory to 10> write the value of 10 in the working memory back to the system memory.
Assume that I is the deposit data of the bank, I = 100. Now I use a B to execute the I = I + 10; (save 10 RMB) operation at the same time, the process may be like this due to asynchronous execution by default:
1. Thread A reads I from the system memory.
2. The B thread reads I from the system memory.
3. Thread A executes I + 10.
4. Line B executes I + 10.
5. Thread A writes 110 back to the system memory. The I value in the memory is 110.
6. The B thread writes 110 back to the system memory. The I value in the memory is 110 ,.
Obviously, the result of this process is incorrect, with less money saved by one person.
Synchronized keyword
I understand that this keyword is used to control objects that have only one reference in the working memory in the case of multithreading.
Multi-thread security instance:
The Code is as follows: |
Copy code |
Package threads; Public class TestIPP { Public static void main (String [] args) throws InterruptedException { Num num = new Num (100000 ); Thread plus = new Plus (num ); Thread cut = new Cut (num ); Plus. start (); Cut. start (); Plus. join (); Cut. join (); System. out. print (num. getNum ()); } Public static class Num { Int num; Public void plus () { Num ++; } Public void cut () { Num --; } Public Num (int num) { This. num = num; } Public int getNum () { Return this. num; } } Static public class Plus extends Thread { Num num; Public Plus (Num num) { This. num = num; } Public void run () { Synchronized (num ){ For (int I = 0; I <5; I ++ ){ Num. plus (); System. out. println ("+ 1 "); } } } } Static public class Cut extends Thread { Private Num num; Public Cut (Num num) { This. num = num; } Public void run () { Synchronized (num ){ For (int I = 0; I <5; I ++ ){ Num. cut (); System. out. println ("-1 "); } } } } } |
Example
The Code is as follows: |
Copy code |
Import java. io .*; // Multi-thread programming Public class MultiThread { Public static void main (String args []) { System. out. println ("I am the main thread! "); // Create thread instance thread1 below ThreadUseExtends thread1 = new ThreadUseExtends (); // When thread2 is created, the THhreadUseRunnable class instance that implements the Runnable interface is used as the parameter. Thread thread2 = new Thread (new ThreadUseRunnable (), "SecondThread "); Thread1.start (); // start thread thread1 to make it ready // Thread1.setPriority (6); // set the priority of thread1 to 6. // The priority determines who occupies the cpu and starts running the ready thread when the cpu is empty. // Priority ranges from 1 to 10, MIN_PRIORITY, MAX_PRIORITY, norm_priority ority // The New thread inherits the parent thread priority created by her. The parent thread usually has the normal priority 5NORM_PRIORITY. System. out. println ("the main thread will be suspended for 7 seconds! "); Try { Thread. sleep (7000); // The main Thread is suspended for 7 seconds. } Catch (InterruptedException e) { Return; } System. out. println ("back to the main thread! "); If (thread1.isAlive ()) { Thread1.stop (); // If thread1 still exists, kill it System. out. println ("thread1 sleep too long, the main thread killed thread1! "); } Else System. out. println ("thread1 was not found in the main thread, and thread1 woke up and the execution ended! "); Thread2.start (); // start thread2 System. out. println ("the main thread will be suspended for another 7 seconds! "); Try { Thread. sleep (7000); // The main Thread is suspended for 7 seconds. } Catch (InterruptedException e) { Return; } System. out. println ("back to the main thread! "); If (thread2.isAlive ()) { Thread2.stop (); // If thread2 still exists, kill it System. out. println ("thread2 sleep too long, the main thread killed thread2! "); } Else System. out. println ("thread2 is not found in the main thread. thread2 is awake and the execution is finished! "); System. out. println ("program end press any key to continue! "); Try { System. in. read (); } Catch (IOException e) { System. out. println (e. toString ()); } } // Main } // MultiThread Class ThreadUseExtends extends Thread // Inherit the Thread class and implement its abstract method run () // Create an instance of this Thread subclass as appropriate to implement the multithreading mechanism // After a thread is started (that is, it enters the ready state), once the CPU is obtained, its run () method is automatically called. { ThreadUseExtends () {}// Constructor Public void run () { System. out. println ("I Am a Thread sub-class Thread instance! "); System. out. println ("I will suspend for 10 seconds! "); System. out. println ("back to the main thread. Please wait. The main thread has not woken up just now! "); Try { Sleep (10000); // hangs for 5 seconds } Catch (InterruptedException e) { Return; } // If the run () method is executed in sequence, the thread ends automatically without being killed by the main thread. // However, if the sleep time is too long, the thread remains alive and may be killed by stop (). } } Class ThreadUseRunnable implements Runnable // Implement the run () method in the Runnable interface, and then implement the class of the run () method. // Create a Thread instance for the parameter { // Thread thread2 = new Thread (this ); // Use this class that implements the run () method in the Runnable interface as the parameter to create a Thread instance of the Thread class ThreadUseRunnable () {}// Constructor Public void run () { System. out. println ("I Am a Thread class Thread instance and take the class that implements the Runnable interface as the parameter! "); System. out. println ("I will suspend for 1 second! "); System. out. println ("back to the main thread. Please wait. The main thread has not woken up just now! "); Try { Thread. sleep (1000); // suspended for 5 seconds } Catch (InterruptedException e) { Return; } // If the run () method is executed in sequence, the thread ends automatically without being killed by the main thread. // However, if the sleep time is too long, the thread remains alive and may be killed by stop (). } } // Modify the sleep time or priority of the program, for example, setPriority () |