java学习笔记之线程4

来源:互联网 发布:特价机票 知乎 编辑:程序博客网 时间:2024/06/05 06:11

在前两篇博客中都用到了Synchronized,但它在程序中并没有发挥什么作用,在这片文章中,我们就让它正真起作用

上两篇博客中synchronized是为什么不能起作用呢??
直接说原因吧:在同一时刻,被synchronized修饰的非静态方法是可以被不同对象访问的。因为非static方法属于对象,有多份,同一时刻可以有多个对象去访问它,不存在资源争夺的问题。而static方法属于类,也叫类方法,它随着类的加载而跟着在内中存在,只有一份,在同一时刻只能有一个对象去访问它

继续对程序做改进:把睡觉和写博客的线程单独封装在了doSomething方法中,然后让run方法去调用它,而且doSomething这个方法是被synchronized修饰的静态方法

这里写图片描述

多次执行结果如下:
这里写图片描述

这里写图片描述

达到了同步执行的效果
至于两件事的先后顺序,是因为当他们都处于Runnable状态的时候都有可能被cpu调度执行,在下一篇文章中会写到怎么去控制这两个线程去按先后顺序同步执行

写到这里,大家应该对被synchronized修饰的方法的用法有一点理解了,这里我们来总结一下:
1,synchronized修饰非静态方法:
因为该方法属于对象,随着对象的创建而跟着存在。
所以该方法在同一时刻被不同对象访问时不存在互斥的情况,可以被多个对象同时访问。但同一时刻同一对象不能再访问该方法
2,synchronized修饰静态方法:
静态方法属于类的,存在方法区中只有一份。
该方法在同一时刻只能被一个对象访问

再来看第三种用法:静态块
直接上代码吧
这里写图片描述

执行结果:
这里写图片描述

执行效果和同步静态方法的效果一样,也达到了同步控制的效果
但是大家注意了在声明lock的时候应该把它声明为类属性:

private static Object lock = new Object();

锁的知识之后再写,反正这儿保证只有一个lock就行,不然也不能得到同步执行的结果
下一篇博客写synchronized修饰类,以及让同步执行的代码再按顺序执行

这是线程5的链接

这是线程5的链接

原创粉丝点击