笔记:学习 Java同步机制 -Synchronization

来源:互联网 发布:360白名单防拦截域名 编辑:程序博客网 时间:2024/05/29 17:02

基础

首先我要知道什麽叫同步?什麽叫异步?

Synchronized直译是同步,同时发生,即是一起做的意思。
但在计算机科学并不是这样理解…..

“Synchronization refers to the coordination of simultaneous threads or processes to complete a task with correct runtime order and no unexpected race”

“Thread synchronization is defined as a mechanism which ensures that two or more concurrent processes or threads do not simultaneously execute some particular program segment known as mutual exclusion.”

以上是摘自Wikipedia,意思即是大家都同步做同一件事,但每一次都能确保只能由一个人来做。
如果能做到这点,就是Synchronization,亦都是所谓的Thread-Safe

所以在计算机世界”同步”的意思是要人排队。

所以如果在某一个快餐店,且只有一部点餐机。人们都没排好队,几十只双手在点餐机乱按,那这间快餐店就是没做好同步的机制,一点都不thread-safe。

但同步在不同范畴也有不同的意思,如Asynchronous call &Synchronous call….又是另一种理解。

总之,如果涉及多线程,且同时存取同一资料,那就有需要做好同步。而这同步的意思是一个机制,能确保以上动作没异常问题发生。

为何叫synchronization?

有待查找。
可能跟时间有关。

出现原因:

首先要理解电脑如何实现多线程:
每个线程都会分配特定的执行时间,然後彼此切换。
至於每个线程如何分配?每个分配多少时间?如何切换?那都是作业系统去处理。
重点是,每个线程都有被执行的机会。

问题来了:
如果多个线程同时存取同一资料,数据就会出现不合理的情况,因线程之问会彼此干扰。

如何干扰?
一个非常重要的概念就是, 对於CPU来说,他并不一行一行代码执行的。
CPU只会看机器指令Assembly Language!一行代码,可能转换成多个指令。
例如:此Copy 叁考资料[7]的例子。

A = A - X; // 可能会转换三个指令:LOAD A, SUB X, STORE A,可能更多。
Print (A);

假设有2个线程:T1,T2执行以上code
可能会出现的程况就是T1进行到 SUB X就被中断,T2接手。
那麽A的值会被T2更改,导致T1计算错误。

初始值:A=100,X=20

LOAD A; //T1, A=100
SUB X; //T1, A=80

LOAD A; //T2接手, T2就从初始值知道A=100,这时,A又变回100
STORE A //T1 此时不知怎的又接回来,些时A=100,T1完成Print(A)并退出

不适当的时间错配,T1最後计算出来的结果是错误的。
以上都是简化後的不标准例子,有兴趣可叁考[7]的内容。

所以对一些Critical code section,是有必要做同步,防止不合理的情况出现。
例如一些财务相关的代码。

How Java’s synchronization mechanism works?

Java有monitor和Lock。
只要一个thread入去了monitor的管辖范围,其他thread都要等,直到那个thread完成并离开。
Java的世界里每一个Object都有自己的lock。
如thread拿着这个lock,就可进入了monitor范围,其他人想要这个lock,monitor就要他们等。

在想要同步的code上加上synchronized,就是需要做同步的地方。
此时,monitor就会做事了。

synchronized (“object”)
{
// Critical code section
}

以上是对一个object进行了加持,当Thread代码运行到这里时,thread就得到这个object的lock。
若在此其间,有其他thread不知怎的,又想用到以上代码,monitor就会充当保安角色,将阻止其他thread,直至当前thread做完了critical code section,并释放出object的的lock。
後面在等的thread就能得到该object的lock,之後就可执行critical code了。

除上以上声名,还可对method加持同步机制。
synchronized void method ();

左思右想,这lock,不就是一个key?
代码中,加上synchronized 就等於告於thread,你要有这个object的lock才可以进去。
为什麽要叫lock呢?意思跟key一样。

还是我理解错误?

重点:

-这个同步机制是以object为单位,而每一个object只有一个lock。
-thread要有指定object的lock才可以执行synchronized 中的代码。

叁考资料:

[1]另一方面了解同步,异步
http://www.ithome.com.tw/node/74544

[2]一个很好的关於线程相关的综合介绍
http://blog.csdn.net/lovejavaydj/article/details/4645439

[3]Java官方文档介绍thead的问题
https://docs.oracle.com/javase/tutorial/essential/concurrency/memconsist.html

[4]有相关代码例子说明同步特性,但有点看不明代码,有待验证。
http://blog.csdn.net/cjjky/article/details/7353390

[5]说明几个同步的要点,可略供叁考
http://www.jackforfun.com/2007/07/java-synchronized.html

[6]另一种的同步的意思Asynchronous call &Synchronous call
http://baike.baidu.com/view/185289.htm

[7]很多Process,Thread重要重点都能在这看到解释
http://programming.im.ncnu.edu.tw/J_Chapter9.htm

[8]深入浅出介绍 Java同步机制
http://www.javaworld.com/article/2074318/java-concurrency/java-101–understanding-java-threads–part-2–thread-synchronization.html

0 0
原创粉丝点击