用線程寫一個3我的往同一張卡里存錢 每一個人存3次 一次存100 存完打印出錢的數目安全
---------------------
public class Synchronization {
public static void main(String[] args) {
MySynchroniza ms1 = new MySynchroniza();
ms1.setName("張三");
ms1.start();
MySynchroniza ms2 = new MySynchroniza();
ms2.setName("王五");
ms2.start();
MySynchroniza ms3 = new MySynchroniza();
ms3.setName("李四");
ms3.start();
}
}
class MySynchroniza extends Thread{
public static int sum = 0;
@Override
public void run() {
for(int i = 0;i<3;i++){
sum = sum + 100;
System.out.println(Thread.currentThread().getName() + ":" + sum);
}
}
}ide
結果
王五:200
王五:400
王五:500
李四:300
李四:600
李四:700
張三:200
張三:800
張三:900
這時候會出現 線程的安全問題 由於 CPU分配權 誰搶到 誰執行 有些線程 搶到了 可是
還沒執行完 一段 代碼 另一個線程 就搶先執行完了本身的代碼 因此出現了 線程 不安全問題this
這時就 引入 線程的同步來解決這個 安全問題線程
------------------------------------------------繼承
第一種
把線程共享的代碼 放到synchronized裏 而後上鎖(全部線程用同一把鎖,
鎖不一樣就會在出現安全問題) 一個線程執行完了另一個線程 才能進來get
public class Synchronization {
public static void main(String[] args) {
MySynchroniza ms1 = new MySynchroniza();
//給線程設置名字
ms1.setName("張三");
ms1.start();
MySynchroniza ms2 = new MySynchroniza();
ms2.setName("王五");
ms2.start();
MySynchroniza ms3 = new MySynchroniza();
ms3.setName("李四");
ms3.start();
}
}
//繼承
class MySynchroniza extends Thread{
public static int sum = 0;
public static Object obj = new Object();
@Override
public void run() {
for(int i = 0;i<3;i++){
synchronized (obj) {
sum = sum + 100;
System.out.println(Thread.currentThread().getName() + ":" + sum);
}
}
}
}
---------------------------------------同步
第二種io
public class Synchronization3 {class
public static void main(String[] args) {
MyThread6 m1 = new MyThread6();
Thread t1 = new Thread(m1);
t1.setName("zhangsan");
t1.start();
Thread t2 = new Thread(m1);
t2.setName("lisi");
t2.start();
Thread t3 = new Thread(m1);
t3.setName("wangwu");
t3.start();
}
}
class MyThread6 implements Runnable{thread
private int sum = 0;
@Override
public void run() {
for(int i = 0;i<3;i++){
//this 爲只new了一次 的 MyThread6 的引用 若是new屢次 鎖就會有多把 就不能用this
synchronized (this) {
sum = sum + 100;
System.out.println(Thread.currentThread().getName() + ":" + sum);
}
}
}
}
--------------------------------
第三種 synchronized 方法
把共享代碼 放進synchronized 聲明的方法裏
public class Synchronizwtion2 {
public static void main(String[] args) {
MyThread5 mythread = new MyThread5();
Thread thread = new Thread(mythread);
Thread thread2 = new Thread(mythread);
Thread thread3 = new Thread(mythread);
thread.setName("張三");
thread2.setName("李四");
thread3.setName("王五");
thread.start();
thread2.start();
thread3.start();
}
}
class MyThread5 implements Runnable {
public int sum = 0; @Override public void run() { for(int i = 0 ;i<3;i++){ sync(); } } public synchronized void sync(){sum = sum + 100;System.out.println(Thread.currentThread().getName() + "當前存了100,現有:" + sum); }}