从头认识多线程-2.3 synchronized持有对象锁与类锁的不同点

来源:互联网 发布:地基处理计算软件 编辑:程序博客网 时间:2024/05/18 23:55

这一章节我们来讨论游戏,synchronized持有对象锁与类锁的不同点-两种锁是并行的东西,没有交集。

1.同步持有对象锁或者类锁

package com.ray.deepintothread.ch02.topic_3;public class SynchInstance5 {public static void main(String[] args) throws InterruptedException {MyTestObjectFive myTestObjectFive = new MyTestObjectFive();for (int i = 0; i < 2; i++) {ThreadFive threadFive = new ThreadFive(myTestObjectFive);Thread thread = new Thread(threadFive);thread.setName("" + i);thread.start();}}}class ThreadFive implements Runnable {private MyTestObjectFive myTestObjectFive;public ThreadFive(MyTestObjectFive myTestObjectFive) {this.myTestObjectFive = myTestObjectFive;}@Overridepublic void run() {try {if (Integer.parseInt(Thread.currentThread().getName()) % 2 == 0) {myTestObjectFive.test1();} else {myTestObjectFive.test2();}} catch (InterruptedException e) {e.printStackTrace();}}}class MyTestObjectFive {public synchronized void test1() throws InterruptedException {for (int i = 0; i < 5; i++) {System.out.println(i);Thread.sleep(100);}}public synchronized void test2() throws InterruptedException {for (int i = 0; i < 5; i++) {System.out.println(i);Thread.sleep(100);}}}

输出:

0
1
2
3
4
0
1
2
3
4


package com.ray.deepintothread.ch02.topic_3;public class SynchInstance6 {public static void main(String[] args) throws InterruptedException {for (int i = 0; i < 2; i++) {ThreadSix threadSix = new ThreadSix();Thread thread = new Thread(threadSix);thread.setName("" + i);thread.start();}}}class ThreadSix implements Runnable {@Overridepublic void run() {try {if (Integer.parseInt(Thread.currentThread().getName()) % 2 == 0) {MyTestObjectSix.test1();} else {MyTestObjectSix.test2();}} catch (InterruptedException e) {e.printStackTrace();}}}class MyTestObjectSix {public static synchronized void test1() throws InterruptedException {for (int i = 0; i < 5; i++) {System.out.println(i);Thread.sleep(100);}}public static synchronized void test2() throws InterruptedException {for (int i = 0; i < 5; i++) {System.out.println(i);Thread.sleep(100);}}}

输出:

0
1
2
3
4
0
1
2
3
4

像前面章节一样,当我们同步持有对象锁或者类锁,输出的是按照顺序的


2.当同时持有对象锁和类锁

package com.ray.deepintothread.ch02.topic_3;public class SynchInstance4 {public static void main(String[] args) throws InterruptedException {MyTestObjectFour myTestObjectThree = new MyTestObjectFour();for (int i = 0; i < 2; i++) {ThreadFour threadFour = new ThreadFour(myTestObjectThree);Thread thread = new Thread(threadFour);thread.setName("" + i);thread.start();}}}class ThreadFour implements Runnable {private MyTestObjectFour myTestObjectThree;public ThreadFour(MyTestObjectFour myTestObjectThree) {this.myTestObjectThree = myTestObjectThree;}@Overridepublic void run() {try {if (Integer.parseInt(Thread.currentThread().getName()) % 2 == 0) {myTestObjectThree.test1();} else {MyTestObjectFour.test2();}} catch (InterruptedException e) {e.printStackTrace();}}}class MyTestObjectFour {public synchronized void test1() throws InterruptedException {for (int i = 0; i < 5; i++) {System.out.println(i);Thread.sleep(100);}}public static synchronized void test2() throws InterruptedException {for (int i = 0; i < 5; i++) {System.out.println(i);Thread.sleep(100);}}}

输出:

0
0
1
1
2
2
3
3
4
4


从输出可以看见,两者就像平行的关系,没有交集,交替的出现。但也是有秩序的。


总结:这一章节讨论了synchronized持有对象锁与类锁的不同点


这一章节就到这里,谢谢

------------------------------------------------------------------------------------

我的github:https://github.com/raylee2015/DeepIntoThread


目录:http://blog.csdn.net/raylee2007/article/details/51204573


0 0
原创粉丝点击