Java 线程同步

概要:

除了可以对代码块进行同步外,对函数也可以实现同步。当一个方法被关键字synchronized声明之后,就只允许一个线程来操作这个方法。但是值得注意的是,“一个线程”指的是一次只能让一个线程运行。这个方法就称为同步方法。

| |目录

技术要点

    实现多线程同步方法的技术要点如下:

  • 同步方法可以控制对类成员变量的访问。每个类的实例对象都对应着一把锁,每个同步方法都必须在获得该类实例对象的锁才能执行,方法一旦被执行,就独占该锁,而其他的线程只能等待,直到从该方法返回时才将锁释放。

  • 在同一类中,只要有可能访问类成员变量的方法均被声明为synchronized,这些synchronized方法可以在多个线程之间同步。当有一个线程进入了有synchronized修饰的方法时,其他线程就不能进入同一个对象使用synchronized来修饰所有的方法,直到第一个线程执行完它所进入的synchronized修饰的方法为止。

注意事项

    多线程同步指的是同一个共享对象的多个线程。

代码实现

package net.xsoftlab.baike;
public class ThreadDemo {
	public static void main(String[] args) {
		ThreadTest1 t1 = new ThreadTest1();// 创建ThreadTest1类的实例对象
		new Thread(t1).start();// 创建线程并启动它
		new Thread(t1).start();// 注意:synchronized同步的是同一个对象的多个线程
		System.out.println(t1.call());// 调用ThreadTest1类的同步方法call()
	}
}
class ThreadTest1 implements Runnable {
	private int x;
	private int y;
	// 定义ThreadTest1的同步方法
	public synchronized void run() {// 重写Runnable接口的run(),并声明成synchronized
		for (int i = 0; i < 4; i++) {
			x++;
			y++;
			try {
				Thread.sleep(200);// 当前运行的线程休眠200毫秒
			} catch (InterruptedException e) {
				System.out.println("线程出错了");
			}
			System.out.println(Thread.currentThread().getName() + " x=" + x
					+ ", y=" + y + " " + i);
		}
	}
	public synchronized String call() {// 自定义方法,并声明成synchronized
		String name = Thread.currentThread().getName();
		return "Hello " + name;
	}
}

程序解读

    从这段代码的结果中我们可以看出,Thread-0和Thread-1都完整地访问了共享资源,从代码的打印顺序上可以看出Thread-0访问完run()后,Thread-1才进入synchronized run()进行数据操作。在Thread-0休眠的时间内,Thread-1也没有进入运行状态。直到Thread-0从synchronized run()方法中返回把锁交给Thread-1。

    而synchronized call()创建的线程没有访问它,是在main()即程序的主线程中调用。所以在没在获得锁的情况下,也只是等待。这就说明了线程的同步很好地解决了多个线程共同访问同一片存储空间发生冲突的问题。


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
资料加载中...
已关注 , 取消