用线程写一个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); }}