Java多线程volatile和synchronized

来源:互联网 发布:小猪cms微电商系统 编辑:程序博客网 时间:2024/05/16 10:27

看了慕课网的视频,并发编程网的文章,疯狂Java的教科书。

现在就来说说,这两个关键字。

1.synchronized (Object obj)

synchronized关键字,最令人疑惑的莫过于它后面的一个任意对象的参数了。

同步代码块就同步代码块嘛,只要进入同步代码块就实现同步不就可以了吗?

其实不是的。

在C++并发编程之中,我们就已经知道了,如果你加锁,是有一个锁对象,以及一个加锁动作的。

只有确保这个锁是同一个锁,才能确保多线程对于加了锁的操作被序列化(这里的序列化与并发、并行相对)。

而在Java中,可以把这个obj看做一个锁对象。只有这个obj在堆内存中是同一块区域,被这个obj声明的所有方法,在多线程环境中才是被序列化的。

由于在Java中,所有的对象都是采用的引用+内存的形式,所以将某个对象传入线程对象的构造函数中,可以确保若干个线程对象里面的obj是同一个内存区域,

这样这几个线程对于该obj下面的同步块的操作就会被序列化。


注意:

由于这个Object obj是Object所以

①内置类型int、double是行不通的,它们不是Object

②Integer、Double也是行不通的,因为包装对象赋值给另一个包装对象的引用,它们最后并没有在内存块中共享同一块内存

比如,Integer i = new Integer(5);
Integer j = i;
j = 11;
System.out.println(i);

这里这个Integer并没有和其他一些对象一样直接在内存中更改,所以会输出5.

所以如果使用包装类型来进行传递,然后拿去同步,就会坑爹。

③每一个类也是Class的一个对象,所以可以用来同步。

0 0
原创粉丝点击