`
ak47zhangrui
  • 浏览: 9230 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于java中的synchronized关键字的一些小研究

阅读更多

虽然做java已经两年多了,但说真的对java中所谓的线程同步异步这类的东东还真不是非常的了解,由于最近在研究android上的游戏开发,看到一个游戏demo里到处都充斥着 synchronized这个关键字,而且由于在游戏开发中对线程的使用十分多,所以便写下了这些东东(高手直接忽略就可以了大笑)。

若有幸被高手看到了这篇博文,如果有错误的话请指出,不胜感激。

关于synchronized关键字我自己写了个测试程序运行了一下,具体情况如下:

先把测试代码贴上来看看:

测试代码1:


测试代码2:


运行Sync的结果如下:

运行结果1

从上面的运行结果来看,线程A、B、C、D都是逐个运行的,只不过这四个线程在运行过程中出现了对系统资源的竞争(我是这么理解的),所以导致了上面的情况发生(比如线程A运行了两步然后线程D又运行了三步,我认为这种情况是线程之间对系统资源的竞争引起的),但有一个地方是可以看出来的,线程A、B、C、D并没有同时开始运行,莫非这就是所谓的互斥?


将TxtThread类的run方法中的代码去掉synchronized包裹层去掉,运行结果如下

运行结果2

从上面的运行结果来看,线程A、B、C、D是同时开始运行的,莫非这就是所谓的同步访问?

下面的内容引用自http://java.chinaitlab.com/base/818583.html


从上面引用的内容来看,当测试程序中的TxtThread中的synchronized没有被删除的时候,相当于4个线程(A、B、C、D)同时访问了一个对象的同步方法,那么当线程A、B、C、D全部执行start方法时,它们应该是首先对系统资源进行竞争获得运行时间然后占用TxtThread的run方法中的同步语句块部分,直到某个线程运行完成之后才能允许下一个线程,这样理解的话感觉跟上面的运行结果1不结果不一样,我看了一下资料,我们在TxtThread的run方法中只是对部分关键代码进行了同步,也就是说不同的线程还是可以同时访问TxtThread方法中的run方法的,如果我们将TxtTHread的run方法中的内容写入到另外一个方法runtest()方法中,并将runtest()方法使用synchronized函数进行修饰并将其放到TxtThread的run方法中调用,那么我们就会看到下面的运行效果了,

这样就符合引用内容中的第一条所说的情况了

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics