1.同步代码块:
使用synchronized包住可能会出现安全问题的代码
import static java.lang.Thread.sleep; class Test01{ public static void main(String[] args) { ThreadTest threadTest = new ThreadTest(); Thread thread1 = new Thread(threadTest); Thread thread2 = new Thread(threadTest); Thread thread3 = new Thread(threadTest); thread1.setName("窗口一"); thread2.setName("窗口二"); thread3.setName("窗口三"); thread1.start(); thread2.start(); thread3.start(); } } class ThreadTest implements Runnable{ /** * 实现三个窗口买票 */ private int ticket = 100; @Override public void run() { while (true){ synchronized (this) { if(ticket>0) { try { sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ticket); ticket--; }else{ break; } } } } }
2.同步方法
在方法上使用synchronized修饰
import static java.lang.Thread.sleep; public class Test02 { public static void main(String[] args) { ThreadTest1 threadTest1 = new ThreadTest1(); Thread thread = new Thread(threadTest1); Thread thread1 = new Thread(threadTest1); Thread thread2 = new Thread(threadTest1); thread.setName("窗口一"); thread1.setName("窗口二"); thread2.setName("窗口三"); thread1.start(); thread.start(); thread2.start(); } } class ThreadTest1 implements Runnable{ private int ticket = 100; @Override public void run() { while (true){ newrun(); } } private synchronized void newrun() { if(ticket>0) { try { sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ticket); ticket--; } } }