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);
}
}
---------------------
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);
}
}
相关文章推荐
- Java学习日记之分身有术:线程
- 线程的同步
- 多线程的学习2
- 3-线程的同步
- 扩展内容(线程的同步方法)
- java读取图片长宽的问题
- 转: JAVA递归算法实例小结
- RxJava和Retrofit2.0的结合使用
- java axis2 发布服务
- Java的数据类型
- 从头认识java-13.10 边界的作用
- 40个Java多线程问题总结
- 追MM与Java的23种设计模式
- spring mvc总结
- java正则表达式入门基础
- Spring4+Struts2+Hibernate5报错:Unable to load configuration. - action -
- 深刻理解Java编程的7个例子
- Java 回调机制
- [javase学习笔记]-6.7 封装
- Spring Boot学习笔记-快速示例