Java中Synchronized的用法

  • 时间:
  • 浏览:1

结果如下:

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

在用synchronized修饰方法须要注意以下几点:

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

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

写法一:

A:0

SyncThread1:0

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

**

B count:1

A:1

B count:2

A:2

B count:3

A:3

B count:4

A:4

B count:5

让我门 知道静态方法是属于类的而不属于对象的。同样的,synchronized修饰的静态方法锁定的是相似 类的所有对象。让我门 对Demo1进行或多或少修改如下:

SyncThread1:2

SyncThread1:3

SyncThread1:4

SyncThread2:5

SyncThread2:6

SyncThread2:7

SyncThread2:8

SyncThread2:9

都是说俩个 多程序运行运行执行synchronized代码块时其它的程序运行运行受阻塞吗?为那此上面的例子中thread1和thread2并肩在执行。这是很久synchronized只锁定对象,每个对象只俩个 多多锁(lock)与之相关联,而上面的代码等同于下面这段代码:

结果如下:

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

作者:luoweifu

转载请标名出处

调用代码:

syncThread1和syncThread2是SyncThread的俩个 多对象,但在thread1和thread2并发执行时却保持了程序运行运行同步。这是很久run中调用了静态方法method,而静态方法是属于类的,或多或少syncThread1和syncThread2合适用了同一把锁。这与Demo1是不同的。

写法一修饰的是俩个 多方法,写法二修饰的是俩个 多代码块,但写法一与写法二是等价的,都是锁定了整个方法时的内容。

*【Demo4】:synchronized修饰俩个 多方法

SyncThread1:0

SyncThread1:1

SyncThread1:2

SyncThread1:3

SyncThread1:4

SyncThread2:5

SyncThread2:6

SyncThread2:7

SyncThread2:8

SyncThread2:9*

在子类方法中加带synchronized关键字

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

当俩个 多并发程序运行运行(thread1和thread2)访问同俩个 多对象(syncThread)中的synchronized代码块时,在同一时刻还还还可不能否了俩个 多多程序运行运行得到执行,那我程序运行运行受阻塞,须要停留当前程序运行运行执行完相似 代码块完后 不需要 执行该代码块。Thread1和thread2是互斥的,很久在执行synchronized代码块不会 锁定当前的对象,还还还可不能否了执行完该代码块不需要 释放该对象锁,下俩个 多程序运行运行不需要 执行并锁定该对象。

让我门 再把SyncThread的调用稍微改一下:

在AccountOperator 类中的run方法里,让我门 用synchronized 给account对象加了锁。这时,当俩个 多程序运行运行访问account对象时,或多或少试图访问account对象的程序运行运行很久阻塞,直到该程序运行运行访问account对象完后 现在开始。也要是说谁拿到那个锁谁就能还还还可不能否了运行它所控制的那段代码。

当俩个 多多明确的对象作为锁时,就能还还还可不能否了用相似下面那我的方法写程序运行运行。

Thread2:500.0

Thread1:500.0

Thread4:500.0

Thread0:500.0

A. 无论synchronized关键字加带方法上还是对象上,很久它作用的对象是非静态的,则它取得的锁是对象;很久synchronized作用的对象是俩个 多静态方法或俩个 多类,则它取得的锁是对类,该类所有的对象同一把锁。

B. 每个对象只俩个 多多锁(lock)与之相关联,谁拿到相似 锁谁就能还还还可不能否了运行它所控制的那段代码。

C. 实现同步是要很大的系统开销作为代价的,甚至很久造成死锁,或多或少尽量正确处理无谓的同步控制。

Synchronized也可修饰俩个 多静态方法,用法如下:

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

2.当俩个 多程序运行运行访问对象的俩个 多synchronized(this)同步代码块时,那我程序运行运行仍然能还还还可不能否了访问该对象中的非synchronized(this)同步代码块。

【Demo2】:多个程序运行运行访问synchronized和非synchronized代码块

结果如下:

调用代码:

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

作者:luoweifu

转载请标名出处

【Demo1】:synchronized的用法

当这麼明确的对象作为锁,要是想让一段代码同步时,能还还还可不能否了创建俩个 多特殊的对象来充当锁:

上面代码中countAdd是俩个 多synchronized的,printCount是非synchronized的。从上面的结果中能还还还可不能否了看出俩个 多程序运行运行访问俩个 多对象的synchronized代码块时,别的程序运行运行能还还还可不能否了访问该对象的非synchronized代码块而不受阻塞。

SyncThread1:0

SyncThread1:1

Synchronized还可作用于俩个 多类,用法如下:

写法二:

参考资料:

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

结果如下:

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

SyncThread2:1

SyncThread1:2

SyncThread2:3

SyncThread1:4

SyncThread2:5

SyncThread2:6

SyncThread1:7

SyncThread1:8

SyncThread2:9

《编程思想之多程序运行运行与多程序运行运行(1)——以操作系统的淬硬层 述说程序运行运行与程序运行运行》一文删改讲述了程序运行运行、程序运行运行的关系及在操作系统中的表现,这是多程序运行运行学习须要了解的基础。本文将接着讲一下Java程序运行运行同步中的俩个 多重要的概念synchronized.

SyncThread的调用:

调用代码:

结果如下:

Thread3:500.0

让我门 把Demo5再作或多或少修改。

【Demo6】:修饰俩个 多类

这时创建了俩个 多SyncThread的对象syncThread1和syncThread2,程序运行运行thread1执行的是syncThread1对象中的synchronized代码(run),而程序运行运行thread2执行的是syncThread2对象中的synchronized代码(run);让我门 知道synchronized锁定的是对象,这不会 有两把锁分别锁定syncThread1对象和syncThread2对象,而这两把锁是互不干扰的,不形成互斥,或多或少俩个 多程序运行运行能还还还可不能否了并肩执行。

【Demo5】:synchronized修饰静态方法