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

java中的synchronized

时间:2015-03-04 22:51:32      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

1、synchronized为互斥。该关键词可以申明方法也可以申明代码库。

import java.util.concurrent.TimeUnit;


public class SynchronizedDemo1 {
	public synchronized static void synchronizedDemo(){
		
	    try {
			TimeUnit.SECONDS.sleep(2);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	    System.out.println("test1");
	}
	
	public static void test1(){
		Thread thread = new Thread(){
			public void run() {
				synchronizedDemo();
			}
		};
		thread.start();
	}
	
	public static void test2(){
		Thread thread = new Thread(){
			public void run() {
				synchronizedDemo();
			}
		};
		thread.start();
	}
	
	public static void main(String[] args) {
		SynchronizedDemo1 sd = new SynchronizedDemo1();
		sd.test1();
		SynchronizedDemo1 sd1 = new SynchronizedDemo1();
		sd1.test2();
	}
}

该类中main为一个线程,分别调用同一个方法。结果得到的互斥的效果,必须要等待前一个方法执行完毕,才能执行后面的调用。经过测试,只要是不同的线程,都会起到互斥的效果

2、下面再看一个例子没有static来修饰的,这里同一对象多个线程都能启动互斥的效果,如果是不同的对象就不能起到互斥的效果。

import java.util.concurrent.TimeUnit;


public class SynchronizedDemo2 {
	public synchronized void synchronizedDemo(){
		
	    try {
			TimeUnit.SECONDS.sleep(2);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	    System.out.println("test1");
	}
	
	public void test1(){
		Thread thread = new Thread(){
			public void run() {
				synchronizedDemo();
			}
		};
		thread.start();
	}
	
	public void test2(){
		Thread thread = new Thread(){
			public void run() {
				synchronizedDemo();
			}
		};
		thread.start();
	}
	
	public static void main(String[] args) {
		SynchronizedDemo2 sd = new SynchronizedDemo2();
		sd.test1();
		SynchronizedDemo2 sd1 = new SynchronizedDemo2();
		sd1.test2();
	}
}

3、将synchronized修饰在i代码块中。这里的效果和前面类似,只是将synchronized放在代码块中更加灵活。

public class SynchronizedDemo3 {
	public  void synchronizedDemo(){
		System.out.println("进入方法:1");
		synchronized(this) {
			try {
				TimeUnit.SECONDS.sleep(2);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("等待后:2");
		}
	    
	    System.out.println("结束后:3");
	}
	
	public void test1(){
		Thread thread = new Thread(){
			public void run() {
				synchronizedDemo();
			}
		};
		thread.start();
	}
	
	public void test2(){
		Thread thread = new Thread(){
			public void run() {
				synchronizedDemo();
			}
		};
		thread.start();
	}
	
	public static void main(String[] args) {
		SynchronizedDemo3 sd = new SynchronizedDemo3();
		sd.test1();
		//SynchronizedDemo3 sd1 = new SynchronizedDemo3();
		sd.test2();
	}
}
<p>结果如下</p><p>进入方法:1</p><p>进入方法:1</p><p>等待后:2</p><p>结束后:3</p><p>等待后:2</p><p>结束后:3</p>

java中的synchronized

标签:

原文地址:http://blog.csdn.net/huwenfeng_2011/article/details/44064233

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