java多线程中使用synchronized说明

1.在类中方法上加上synchronized关键字,是对整个对象加锁,当一个线程访问带有synchronized的方法时,其他带有synchronized的方法的访问就都会阻塞。

样例:

public class ThreadTest {
	public static void main(String[] args) {
		Stu stu = new Stu();
		StuThread1 t1 = new StuThread1(stu);
		t1.start();
		StuThread2 t2 = new StuThread2(stu);
		t2.start();
	}
}

class StuThread1 extends Thread {
	Stu stu;

	public StuThread1(Stu stu) {
		this.stu = stu;
	}

	public void run() {
		stu.read1();
	}
}

class StuThread2 extends Thread {
	Stu stu;

	public StuThread2(Stu stu) {
		this.stu = stu;
	}

	public void run() {
		stu.read2();
	}
}

class Stu {
	public synchronized void read1() {
		System.out.println("read1 begin");
		try {
			Thread.currentThread().sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("read1 end");
	}

	public synchronized void read2() {
		System.out.println("read2 begin");
		try {
			Thread.currentThread().sleep(2000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("read2 end");
	}
}


打印结果为(两个线程是顺序执行的):

read1 begin
read1 end
read2 begin
read2 end

如果去掉read2前面的synchronized关键字,打印为(线程出现了交叉执行):

read1 begin
read2 begin
read2 end
read1 end

修改read2方法,

public void read2() {
		synchronized(this)
		{
			System.out.println("read2 begin");
			try {
				Thread.currentThread().sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("read2 end");
		}
	}

对this进行加锁,结果同一次,线程是顺序执行的。







猜你喜欢

转载自blog.csdn.net/yinxing2008/article/details/25548577