楼上的,别“窃”“窃”的,有甘草支持你。synchronized关键字的实现,很有可能是采用类似于Windows API CriticalSection系,和CRITICAL_SECTION 结构结构,这样轻量的临界区实现的。 这一点,在.Net上是确凿的,我见过C# lock实现的原理文章。代码摘自那篇文章。 class SomeType { private: // The private CRITICAL_SECTION field // associated with each object CRITICAL_SECTION m_csObject; public: SomeType() { // The constructor initializes the // object's CRITICAL_SECTION field InitializeCriticalSection(&m_csObject); } 临界区的意义在于同一个函数的临界区不可以多线程重入,但是Java的synchronized关键字在用为函数修饰的时候,把这种粒度放大了,放大到整个函数。 C#的Lock在于使得整个对象的每一个方法都带有了这种不可重入的属性,。 附带一点,教科书里面讲: 当一个线程访问synchronized方法的时候,其他线程对该方法和该类所有其它synchronized的方法都不能访问了。why? 看前面的C++代码,很显然的事情。 当然了,synchronized函数起作用的时候,另外一个函数会产生阻塞和等待的效果,但是这个不能称之为同步。 同步是一个逻辑上的概念,而谁都不该用这个关键字构造出一种逻辑事务等待的效果。 它是为了最基本的现场安全考虑的,而同步是为了多线程逻辑的实现考虑的。窃以为,除了Java,怎么也得再学点东西。
hehe 我也找了些原版资料 稍释心中疑惑In computer science, synchronization refers to one of two distinct, but related concepts: synchronization of processes, and synchronization of data. Process synchronization refers to the idea that multiple processes are to join up or handshake at a certain point, so as to reach an agreement or commit to a certain sequence of action. Data synchronization refers to the idea of keeping multiple copies of a dataset in coherence with one another, or to maintain data integrity. Process synchronization primitives are commonly used to implement data synchronization.
In computer science, synchronization refers to one of two distinct, but related concepts: synchronization of processes, and synchronization of data. Process synchronization refers to the idea that multiple processes are to join up or handshake at a certain point, so as to reach an agreement or commit to a certain sequence of action. Data synchronization refers to the idea of keeping multiple copies of a dataset in coherence with one another, or to maintain data integrity. Process synchronization primitives are commonly used to implement data synchronization.
在java.util下面
既然如此 它所实现的效果又貌似于其解释相背
所谓同步效果 我一直质疑这种说法啊
窃以为asynchronized与其实现效果更贴切
这一点,在.Net上是确凿的,我见过C# lock实现的原理文章。代码摘自那篇文章。
class SomeType {
private:
// The private CRITICAL_SECTION field
// associated with each object
CRITICAL_SECTION m_csObject;
public:
SomeType() {
// The constructor initializes the
// object's CRITICAL_SECTION field
InitializeCriticalSection(&m_csObject);
}
临界区的意义在于同一个函数的临界区不可以多线程重入,但是Java的synchronized关键字在用为函数修饰的时候,把这种粒度放大了,放大到整个函数。
C#的Lock在于使得整个对象的每一个方法都带有了这种不可重入的属性,。
附带一点,教科书里面讲:
当一个线程访问synchronized方法的时候,其他线程对该方法和该类所有其它synchronized的方法都不能访问了。why?
看前面的C++代码,很显然的事情。
当然了,synchronized函数起作用的时候,另外一个函数会产生阻塞和等待的效果,但是这个不能称之为同步。
同步是一个逻辑上的概念,而谁都不该用这个关键字构造出一种逻辑事务等待的效果。
它是为了最基本的现场安全考虑的,而同步是为了多线程逻辑的实现考虑的。窃以为,除了Java,怎么也得再学点东西。
不过如果synchronized关键字可以工作的话,尽量不用Lock/Condition结构
甘草...synchronized也可以对变量进行修饰的.
当然我承认我第一次知道和运用是在操作系统的学习中,当时用的是C.同样是临界区的概念
窃以为,除了Java,怎么也得再学点东西。
支持你...不同的语言对比学习,效果更好.
跟JAVA的懒惰的原则不符(个人以为)
从而减少出错的几率
不过这还要看个人喜好
syn-chro-nized
新-可洛-耐丝的
{
}
-----------------------------------------
那你还要记得synchronized才能写出来这个类呀,呵呵