多线程系列(一)

来源:互联网 发布:js if语句的嵌套 编辑:程序博客网 时间:2024/05/17 08:58

1、线程安全的概念

当多个线程同时访问同一个某一个类时,这个类始终能表现出正确的行为,那个整个类就是线程安全的。

synchronized:可以在任意对象及方法上加锁,而加锁的这段代码称为“互斥区”或"临界区"


执行之后得到结果并不是我们预期的,我们预期的结果应该是4、3、2、1、0。

下面是我们加上锁


如图所示,最终的结果是跟我们预期一样的,但是线程顺序跟我们源代码顺序不一样。这是因为这个是由CPU分配顺序决定的,跟源码顺序没有任何关系。


原理分析

Java 内存模型把 Java 虚拟机内部划分为线程栈和堆。这张图演示了 Java 内存模型的逻辑视图。


每一个运行在jvm里面的线程都有一个线程栈,一个线程只能访问自己的线程栈。一个线程创建自己的本地变量对其他线程是不可见的,只有自己可以看见。即使两个线程运行相同的代码,这两个线程仍然在自己的线程栈中创建自己的本地变量。

heap上放的是java创建的所有对象,无论是哪个对象创建的。一个对象的成员变量会随着这个对象自身存放在堆上, 不管这个成员变量是原始类型还是引用类型。

静态变量也随着类一起放在堆上。

放在堆上的对象可以被持有该对象的引用的线程访问。当线程访问一个对象时它也可以访问该对象的成员变量。这就是为什么造成Mythread1是线程不安全的。

0 0
原创粉丝点击