Java多线程(二)同步
- - CSDN博客编程语言推荐文章如果你的java基础较弱,或者不大了解java多线程请先看这篇文章  java多线程(一)线程定义、状态和属性. 同步一直是java多线程的难点,在我们做android开发时也很少应用,但这并不是我们不熟悉同步的理由. 希望这篇文章能使更多的人能够了解并且应用java的同步. 在多线程的应用中,两个或者两个以上的线程需要共享对同一个数据的存取. 
多线程加锁,2种方式
1.同步代码块,使用的锁可以是任意对象,但是操作共享资源时,锁必须唯一!   
2.同步函数,使用的锁是this!
package com.gc.thread;
public class SynchronizdMethod implements Runnable {
	//共享资源
	private int num = 1000;
	
	//不同的线程进入不同的同步代码中,验证同步函数使用的锁与同步代码块的锁是否一致
	//如果不一致,则会导致数据混乱!
	boolean flag = true;
	
	@Override
	public void run() {
		if(flag) {
			//改变标记,当b线程开启后,执行run(),就会进入到同步函数中
			flag = false;
			while(true) {
				//同步代码块。判断 num>0 和 num-- 都是对共享资源进行操作,所以要放在同步代码块中
				synchronized(this) {
					//只要本次的同步代码块中的代码没有执行完,其它线程无法进入,因为锁没有释放
					if(num>0)
						System.out.println(Thread.currentThread().getName() + ": code segment--->" + num--);
				}
			}
		} else {
			while(true)
				anotherThread();
		}
	}
	
	//同步函数---使用函数对操作共享资源的代码进行封装,再将锁声明在方法上
        //使用的锁是this,即传入Thread构造函数中的Runnable子类对象
	private synchronized void anotherThread() {
		if(num>0)
			System.out.println(Thread.currentThread().getName() + ": method--->" + num--);
	}
}
  
开启多线程
package com.gc.thread;
public class Demo {
	public static void main(String[] args) {
		
		SynchronizdMethod runnable = new SynchronizdMethod();
		
		//传入同一个Runnable接口子类对象,让多线程操作Runnable中封装的共享资源
		Thread a = new Thread(runnable);
		Thread b = new Thread(runnable);
		
		//开启线程  【注意:一个线程只能调用1次start(),多次调用将抛"线程运行状态异常"】
		a.start();
		//让主线程睡眠一小会,让a线程先执行,a线程将执行同步代码块中的代码
		try {
			Thread.sleep(10);//主线程睡眠的目的:让a线程先进入到同步代码块中,将标记改为false
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		//a线程改变flag标记之后,再开启b线程,让b线程执行同步函数中的代码
		b.start();
	}
}