码迷,mamicode.com
首页 > 编程语言 > 详细

从头认识多线程-2.24 修改监视器对同步的影响

时间:2016-05-20 19:44:31      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:

这一章节我们来讨论一下修改监视器对同步的影响。

1.不修改监视器,同步的

package com.ray.deepintothread.ch02.topic_24;

/**
 * 
 * @author RayLee
 *
 */
public class SynchOfStaticInnerClass {

	public static void main(String[] args) {
		Thread thread = new Thread(new Runnable() {
			public void run() {
				MyService.updateA();
			}
		});
		thread.start();
		Thread thread2 = new Thread(new Runnable() {
			public void run() {
				MyService.updateB();
			}
		});
		thread2.start();
	}
}

class MyService {

	private static int id = 0;

	private static String lock = "a";

	public static void updateA() {
		synchronized (lock) {
			for (int i = 0; i < 10; i++) {
				System.out.println("Thread name:" + Thread.currentThread().getName() + " id:" + id++);
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public static void updateB() {
		synchronized (lock) {
			for (int i = 0; i < 10; i++) {
				System.out.println("Thread name:" + Thread.currentThread().getName() + " id:" + id++);
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

}

输出:

Thread name:Thread-0 id:0
Thread name:Thread-0 id:1
Thread name:Thread-0 id:2
Thread name:Thread-0 id:3
Thread name:Thread-0 id:4
Thread name:Thread-0 id:5
Thread name:Thread-0 id:6
Thread name:Thread-0 id:7
Thread name:Thread-0 id:8
Thread name:Thread-0 id:9
Thread name:Thread-1 id:10
Thread name:Thread-1 id:11
Thread name:Thread-1 id:12
Thread name:Thread-1 id:13
Thread name:Thread-1 id:14
Thread name:Thread-1 id:15
Thread name:Thread-1 id:16
Thread name:Thread-1 id:17
Thread name:Thread-1 id:18
Thread name:Thread-1 id:19


2.当修改发生在线程开始的时候,把同步变成异步

package com.ray.deepintothread.ch02.topic_24;

/**
 * 
 * @author RayLee
 *
 */
public class SynchOfStaticInnerClass2 {

	public static void main(String[] args) {
		Thread thread = new Thread(new Runnable() {
			public void run() {
				MyService2.updateA();
			}
		});
		thread.start();
		Thread thread2 = new Thread(new Runnable() {
			public void run() {
				MyService2.updateB();
			}
		});
		thread2.start();
	}
}

class MyService2 {

	private static int a = 0;

	private static Object lock = new Object();

	public static void updateA() {
		synchronized (lock) {
			lock = new Object();
			for (int i = 0; i < 10; i++) {
				System.out.println("Thread name:" + Thread.currentThread().getName() + " a:" + a++);
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public static void updateB() {
		synchronized (lock) {
			for (int i = 0; i < 10; i++) {
				System.out.println("Thread name:" + Thread.currentThread().getName() + " a:" + a++);
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

}

输出:

Thread name:Thread-1 a:0
Thread name:Thread-0 a:0
Thread name:Thread-1 a:1
Thread name:Thread-0 a:2
Thread name:Thread-0 a:3
Thread name:Thread-1 a:4
Thread name:Thread-0 a:5
Thread name:Thread-1 a:6
Thread name:Thread-0 a:7
Thread name:Thread-1 a:8
Thread name:Thread-1 a:9
Thread name:Thread-0 a:10
Thread name:Thread-0 a:11
Thread name:Thread-1 a:12
Thread name:Thread-1 a:13
Thread name:Thread-0 a:14
Thread name:Thread-0 a:15
Thread name:Thread-1 a:16
Thread name:Thread-0 a:17
Thread name:Thread-1 a:18


这里原因不明,笔者曾尝试过在for里面每执行一次就输出相应的lock,都是一样的,但是,从输出结果就已经可以看见,其实已经是不同步的了


3.当修改发生在线程开始了一段时间之后,对同步没有影响

package com.ray.deepintothread.ch02.topic_24;

/**
 * 
 * @author RayLee
 *
 */
public class SynchOfStaticInnerClass3 {

	public static void main(String[] args) {
		Thread thread = new Thread(new Runnable() {
			public void run() {
				MyService3.updateA();
			}
		});
		thread.start();
		Thread thread2 = new Thread(new Runnable() {
			public void run() {
				MyService3.updateB();
			}
		});
		thread2.start();
	}
}

class MyService3 {

	private static int a = 0;

	private static Object lock = new Object();

	public static void updateA() {
		synchronized (lock) {
			for (int i = 0; i < 10; i++) {
				if (i == 5) {//把对监视器的修改延时了
					lock = new Object();
				}
				System.out.println("Thread name:" + Thread.currentThread().getName() + " a:" + a++);
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public static void updateB() {
		synchronized (lock) {
			for (int i = 0; i < 10; i++) {
				System.out.println("Thread name:" + Thread.currentThread().getName() + " a:" + a++);
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

}

输出:

Thread name:Thread-0 a:0
Thread name:Thread-0 a:1
Thread name:Thread-0 a:2
Thread name:Thread-0 a:3
Thread name:Thread-0 a:4
Thread name:Thread-0 a:5
Thread name:Thread-0 a:6
Thread name:Thread-0 a:7
Thread name:Thread-0 a:8
Thread name:Thread-0 a:9
Thread name:Thread-1 a:10
Thread name:Thread-1 a:11
Thread name:Thread-1 a:12
Thread name:Thread-1 a:13
Thread name:Thread-1 a:14
Thread name:Thread-1 a:15
Thread name:Thread-1 a:16
Thread name:Thread-1 a:17
Thread name:Thread-1 a:18
Thread name:Thread-1 a:19


package com.ray.deepintothread.ch02.topic_24;

/**
 * 
 * @author RayLee
 *
 */
public class SynchOfStaticInnerClass4 {

	public static void main(String[] args) {
		Thread thread = new Thread(new Runnable() {
			public void run() {
				try {
					MyService4.updateA();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
		thread.start();
		Thread thread2 = new Thread(new Runnable() {
			public void run() {
				MyService4.updateB();
			}
		});
		thread2.start();
	}
}

class MyService4 {

	private static int a = 0;

	private static Object lock = new Object();

	public static void updateA() throws InterruptedException {
		synchronized (lock) {
			Thread.sleep(300);//把对监视器的修改延时了
			lock = new Object();
			for (int i = 0; i < 10; i++) {
				System.out.println("Thread name:" + Thread.currentThread().getName() + " a:" + a++);
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public static void updateB() {
		synchronized (lock) {
			for (int i = 0; i < 10; i++) {
				System.out.println("Thread name:" + Thread.currentThread().getName() + " a:" + a++);
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

}

输出:

Thread name:Thread-0 a:0
Thread name:Thread-0 a:1
Thread name:Thread-0 a:2
Thread name:Thread-0 a:3
Thread name:Thread-0 a:4
Thread name:Thread-0 a:5
Thread name:Thread-0 a:6
Thread name:Thread-0 a:7
Thread name:Thread-0 a:8
Thread name:Thread-0 a:9
Thread name:Thread-1 a:10
Thread name:Thread-1 a:11
Thread name:Thread-1 a:12
Thread name:Thread-1 a:13
Thread name:Thread-1 a:14
Thread name:Thread-1 a:15
Thread name:Thread-1 a:16
Thread name:Thread-1 a:17
Thread name:Thread-1 a:18
Thread name:Thread-1 a:19


4.修改监视器对象的属性,对同步没有影响

package com.ray.deepintothread.ch02.topic_24;

/**
 * 
 * @author RayLee
 *
 */
public class SynchOfStaticInnerClass5 {

	public static void main(String[] args) {
		MyService5 myService5 = new MyService5();
		Thread thread = new Thread(new Runnable() {
			public void run() {
				try {
					myService5.updateA();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		});
		thread.start();
		Thread thread2 = new Thread(new Runnable() {
			public void run() {
				myService5.updateB();
			}
		});
		thread2.start();
	}
}

class MyService5 {

	private static int a = 0;

	private static Monitor lock;

	public MyService5() {
		lock = new Monitor();
		lock.id = 1;
	}

	public void updateA() throws InterruptedException {
		synchronized (lock) {
			lock.id = 2;// 修改对象的属性
			Thread.sleep(300);
			for (int i = 0; i < 10; i++) {
				System.out.println("Thread name:" + Thread.currentThread().getName() + " a:" + a++);
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public void updateB() {
		synchronized (lock) {
			for (int i = 0; i < 10; i++) {
				System.out.println("Thread name:" + Thread.currentThread().getName() + " a:" + a++);
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

}

class Monitor {
	public int id = 0;
}


输出:

Thread name:Thread-0 a:0
Thread name:Thread-0 a:1
Thread name:Thread-0 a:2
Thread name:Thread-0 a:3
Thread name:Thread-0 a:4
Thread name:Thread-0 a:5
Thread name:Thread-0 a:6
Thread name:Thread-0 a:7
Thread name:Thread-0 a:8
Thread name:Thread-0 a:9
Thread name:Thread-1 a:10
Thread name:Thread-1 a:11
Thread name:Thread-1 a:12
Thread name:Thread-1 a:13
Thread name:Thread-1 a:14
Thread name:Thread-1 a:15
Thread name:Thread-1 a:16
Thread name:Thread-1 a:17
Thread name:Thread-1 a:18
Thread name:Thread-1 a:19


总结:这一章节我们总结了几种修改监视器对同步的影响。


这一章节就到这里,谢谢

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

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


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


从头认识多线程-2.24 修改监视器对同步的影响

标签:

原文地址:http://blog.csdn.net/raylee2007/article/details/51462569

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!