当两个或多个线程需要访问共享的资源时,它们需要以某种方式确保每次只有一个线程使用资源。实现这个目的的过程称作同步。
同步的关键是监视器的概念,监视器就是用作互斥锁的对象。在给定的时刻,只有一个线程可以拥有监视器。当线程取得锁时,也就进入了监视器。其他企图进入加锁监视器的线程都会被挂起,直到第一个线程退出监视器。也就是说,这些等待的其他线程在等待监视器,如果需要的话,拥有监视器的线程可以再次进入监视器。
使用同步的方法:
package IO; /** * @author 犀角 * @date 2019/11/1 10:10 * @description */ class Callme { void call(String msg) { System.out.println("[" + msg); try { Thread.sleep(1000); } catch (InterruptedException e) { System.out.println("Interrupted!"); } System.out.println("]"); } } class Caller implements Runnable { String msg; Callme target; Thread t; public Caller(Callme targ, String s) { target = targ; msg = s; t = new Thread(this); t.start(); } @Override public void run() { target.call(msg); } } public class Synch { public static void main(String[] args) { Callme target = new Callme(); Caller ob1 = new Caller(target, "Hello"); Caller ob2 = new Caller(target, "Synchronized"); Caller ob3 = new Caller(target, "World!"); //wait for threads to end try { ob1.t.join(); ob2.t.join(); ob3.t.join(); } catch (InterruptedException e) { System.out.println("Interrupted"); } } }