解决资源共享问题的方法通常是在指定时间段内只容许一个线程访问共享资源,这时就须要给共享资源上一道锁,好比售票员售票,当一个售票员在售第X张票时,就把资源X锁住了,直到售票结束。java
线程同步的方法:ide
一、同步块spa
synchronized(object){ } //object:同步块锁定的对象,不容许同一时间共享的资源
package Thirteen; public class ThreadSafeTest extends Thread { /*Integer i=0; i是一个对象 int i=3; i是一个基础变量 */ private static Integer num = 1; public ThreadSafeTest(String name){ //void java.lang.Thread.setName(String name) setName(name); } @Override public void run(){ synchronized(num){ if(num>0){ System.out.println(getName()+":检测票数大于0,能够出票"); System.out.println(getName()+":\t正在收款(大约5秒)……"); try{ Thread.sleep(5000); System.out.println(getName()+":\t售票完成"); num--; System.out.println("系统当前票数:"+num); if(num<0) System.out.println("警告:无票"); }catch(InterruptedException e){ e.printStackTrace(); } }else{ System.out.println("无票,中止销售"); } } } public static void main(String[] args){ try{ new ThreadSafeTest("售票员A").start(); Thread.sleep(2000); new ThreadSafeTest("售票员B").start(); }catch(InterruptedException e){ e.printStackTrace(); } } }
二、同步方法线程
synchronized void syncMethod(){ }
package Thirteen; public class ThreadSafeTest extends Thread { /*Integer i=0; i是一个对象 int i=3; i是一个基础变量 */ private static Integer num = 1; public ThreadSafeTest(String name){ //void java.lang.Thread.setName(String name) setName(name); } @Override public void run(){ sell(getName()); } //synchronized(num) private static synchronized void sell(String name) { if(num>0){ System.out.println(name+":检测票数大于0,能够出票"); System.out.println(name+":\t正在收款(大约5秒)……"); try{ Thread.sleep(5000); System.out.println(name+":\t售票完成"); num--; System.out.println("系统当前票数:"+num); if(num<0) System.out.println("警告:无票"); }catch(InterruptedException e){ e.printStackTrace(); } }else{ System.out.println("无票,中止销售"); } } public static void main(String[] args){ try{ new ThreadSafeTest("售票员A").start(); Thread.sleep(2000); new ThreadSafeTest("售票员B").start(); }catch(InterruptedException e){ e.printStackTrace(); } } } //程序运行结果同上