Java Concurrency/Threads(4) —— synchronized

package com.guoqiang;

import java.util.zip.CheckedOutputStream;

import static com.guoqiang.ThreadColor.*;

public class Main {

    public static void main(String[] args) {
        CountDown cd = new CountDown();

        Thread t1 = new ThreadCountDown(cd);
        t1.setName("Thread 1");
        Thread t2 = new ThreadCountDown(cd);
        t2.setName("Thread 2");

        t1.start();
        t2.start();
    }
}

class CountDown {
    public void countDown() {
        String color;
        switch (Thread.currentThread().getName()) {
            case "Thread 1" :
                color = ANSI_CYAN;
                break;
            case "Thread 2":
                color = ANSI_RED;
                break;
            default:
                color = ANSI_GREEN;
        }
        for (int i = 10; i >= 0; i--) {
            System.out.println(color + Thread.currentThread().getName() + ": i = " + i);
        }
    }
}

class ThreadCountDown extends Thread {
    private CountDown countDown;
    public ThreadCountDown(CountDown cd) {
        countDown = cd;
    }
    @Override
    public void run() {
        countDown.countDown();
    }
}

OUT:
1599892-20190905184318673-743163445.png

将Class:CountDown改为:

class CountDown {
    private int i; //将i变为全局变量
    public void countDown() {
        String color;
        switch (Thread.currentThread().getName()) {
            case "Thread 1" :
                color = ANSI_CYAN;
                break;
            case "Thread 2":
                color = ANSI_RED;
                break;
            default:
                color = ANSI_GREEN;
        }
        for (i = 10; i >= 0; i--) {
            System.out.println(color + Thread.currentThread().getName() + ": i = " + i);
        }
    }
}

OUT:
1599892-20190905184601187-1412775292.png

原因:

  1. Heap是一个进程的所有threads共享的一段内存空间
  2. 每个threads有自己独立的无法被别人访问的thread stack空间
  3. local variables 局部变量存放在thread stack中,每个threads都有自己独立的local variable的副本(存放线程栈空间)
  4. object instance value 存放在heap上,每个在同一个对象上工作的threads,共享对象的全局变量。

synchronized 关键词

使用synchronized关键词修饰static object / static method
synchronized 一个 语句块
```java
synchronized(this) { // synchronized 的对象必须存在在heap上,多个线程对这个对象共享。
statement1;
statement2;
}

转载于:https://www.cnblogs.com/isguoqiang/p/11469162.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值