Java中Synchronized的用法

  • 时间:
  • 浏览:3

synchronized是Java中的关键字,是一种生活同步锁。它修饰的对象有以下几种:

Synchronized作用于整个辦法 的写法。

写法一:

写法二:

在子类辦法 中添加synchronized关键字

Synchronized也可修饰一有1个静态辦法 ,用法如下:

结果如下:

一定会说一有1个系统进程执行synchronized代码块时其它的系统进程受阻塞吗?为哪几种后边的例子中thread1和thread2同時 在执行。这是机会synchronized只锁定对象,每个对象只一有1个锁(lock)与之相关联,而后边的代码等同于下面这段代码:

调用代码:

Synchronized修饰一有1个辦法 很简单,但会 在辦法 的前面加synchronized,public synchronized void method(){//todo}; synchronized修饰辦法 和修饰一有1个代码块类似,但会 作用范围不一样,修饰代码块是大括号括起来的范围,而修饰辦法 范围是整个函数。如将【Demo1】中的run辦法 改成如下的辦法 ,实现的效果一样。

B count:1

A:1

B count:2

A:2

B count:3

A:3

B count:4

A:4

B count:5

SyncThread的调用:

调用代码:

在用synchronized修饰辦法 时要注意以下几点:

【Demo5】:synchronized修饰静态辦法

【Demo3】:指定要给某个对象加锁

结果如下:

在子类辦法 中调用父类的同步辦法

大家儿知道静态辦法 是属于类的而不属于对象的。同样的,synchronized修饰的静态辦法 锁定的是这些 类的所有对象。大家儿对Demo1进行有些修改如下:

A:0

写法一修饰的是一有1个辦法 ,写法二修饰的是一有1个代码块,但写法一与写法二是等价的,一定会锁定了整个辦法 时的内容。

2.当一有1个系统进程访问对象的一有1个synchronized(this)同步代码块时,原来系统进程仍然时要访问该对象中的非synchronized(this)同步代码块。

【Demo2】:多个系统进程访问synchronized和非synchronized代码块

参考资料:

http://blog.csdn.net/chenguang79/article/details/677720http://developer.51cto.com/art/60 906/132354.htm

大家儿把Demo5再作有些修改。

【Demo6】:修饰一有1个类

SyncThread2:1

SyncThread1:2

SyncThread2:3

SyncThread1:4

SyncThread2:5

SyncThread2:6

SyncThread1:7

SyncThread1:8

SyncThread2:9

Thread2:60 00.0

Thread1:60 00.0

Thread4:60 00.0

Thread0:60 00.0

SyncThread1:0

SyncThread1:1

*【Demo4】:synchronized修饰一有1个辦法

说明:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则时要7行操作码。

当没法 明确的对象作为锁,但会 想让一段代码同步时,时要创建一有1个特殊的对象来充当锁:

这时创建了一有1个SyncThread的对象syncThread1和syncThread2,系统进程thread1执行的是syncThread1对象中的synchronized代码(run),而系统进程thread2执行的是syncThread2对象中的synchronized代码(run);大家儿知道synchronized锁定的是对象,这些 定会有两把锁分别锁定syncThread1对象和syncThread2对象,而这两把锁是互不干扰的,不形成互斥,要是一有1个系统进程时要同時 执行。

《编程思想之系统进程与系统进程(1)——以操作系统的层厚述说系统进程与系统进程》一文完正讲述了系统进程、系统进程的关系及在操作系统中的表现,这是系统进程学习时要了解的基础。本文将接着讲一下Java系统进程同步中的一有1个重要的概念synchronized.

调用代码:

SyncThread1:2

SyncThread1:3

SyncThread1:4

SyncThread2:5

SyncThread2:6

SyncThread2:7

SyncThread2:8

SyncThread2:9

A. 无论synchronized关键字添加辦法 上还是对象上,机会它作用的对象是非静态的,则它取得的锁是对象;机会synchronized作用的对象是一有1个静态辦法 或一有1个类,则它取得的锁是对类,该类所有的对象同一把锁。

B. 每个对象只一有1个锁(lock)与之相关联,谁拿到这些 锁谁就时要运行它所控制的那段代码。

C. 实现同步是要很大的系统开销作为代价的,甚至机会造成死锁,要是尽量解决无谓的同步控制。

SyncThread1:0

SyncThread1:1

SyncThread1:2

SyncThread1:3

SyncThread1:4

SyncThread2:5

SyncThread2:6

SyncThread2:7

SyncThread2:8

SyncThread2:9*

结果如下:

Synchronized还可作用于一有1个类,用法如下:

【Demo1】:synchronized的用法

原文:http://blog.csdn.net/luoweifu/article/details/466160 15

作者:luoweifu

转载请标名出处

其效果和【Demo5】是一样的,synchronized作用于一有1个类T时,是给这些 类T加锁,T的所有对象用的是同一把锁。

**

结果如下:

当一有1个并发系统进程(thread1和thread2)访问同一有1个对象(syncThread)中的synchronized代码块时,在同一时刻不并能一有1个系统进程得到执行,原来系统进程受阻塞,时要等待英文当前系统进程执行完这些 代码块要是并能执行该代码块。Thread1和thread2是互斥的,机会在执行synchronized代码块一定会锁定当前的对象,不并能执行完该代码块并能释放该对象锁,下一有1个系统进程并能执行并锁定该对象。

大家儿再把SyncThread的调用稍微改一下:

原文:http://blog.csdn.net/luoweifu/article/details/466160 15

作者:luoweifu

转载请标名出处

SyncThread1:0

结果如下:

在AccountOperator 类中的run辦法 里,大家儿用synchronized 给account对象加了锁。这时,当一有1个系统进程访问account对象时,有些试图访问account对象的系统进程机会阻塞,直到该系统进程访问account对象现在始于。也但会 说谁拿到那个锁谁就时要运行它所控制的那段代码。

当一有1个明确的对象作为锁时,就时要用类似下面原来的辦法 写系统进程。

Thread3:60 00.0

后边代码中countAdd是一有1个synchronized的,printCount是非synchronized的。从后边的结果中时要看出一有1个系统进程访问一有1个对象的synchronized代码块时,别的系统进程时要访问该对象的非synchronized代码块而不受阻塞。

syncThread1和syncThread2是SyncThread的一有1个对象,但在thread1和thread2并发执行时却保持了系统进程同步。这是机会run中调用了静态辦法 method,而静态辦法 是属于类的,要是syncThread1和syncThread2大概用了同一把锁。这与Demo1是不同的。