您的位置:首页 > 编程语言 > Java开发

java第二阶段学习day3.2

2015-12-21 00:00 288 查看
用线程写一个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);
}
}

}

结果
王五:200
王五:400
王五:500
李四:300
李四:600
李四:700
张三:200
张三:800
张三:900
这时候会出现 线程的安全问题 因为 CPU分配权 谁抢到 谁执行 有些线程 抢到了 但是
还没执行完 一段 代码 另外一个线程 就抢先执行完了自己的代码 所以出现了 线程 不安全问题

这时就 引入 线程的同步来解决这个 安全问题

------------------------------------------------

第一种
把线程共享的代码 放到synchronized里 然后上锁(所有线程用同一把锁,
锁不同就会在出现安全问题) 一个线程执行完了另外一个线程 才能进来

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);
}
}
}

}
---------------------------------------

第二种

public class Synchronization3 {

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{

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  线程的同步