您当前的位置: 首页 >  Java

蓝不蓝编程

暂无认证

  • 5浏览

    0关注

    706博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

java多线程中使用synchronized说明

蓝不蓝编程 发布时间:2014-05-11 15:41:53 ,浏览量:5

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进行加锁,结果同一次,线程是顺序执行的。


关注
打赏
1639405877
查看更多评论
立即登录/注册

微信扫码登录

0.0391s