很简单的一个多线程模式之一,多个资源使用者使用资源时,资源类封装同步的方法,简单的加锁而于,属于一个使用者在使用其它使用者简单的等候,等候逻辑代码并不需要写,由Java虚拟机管理代码如下:
- public class MainThread {
- public static void main(String[] args) {
- System.out.println("Testing Gate, hit CTRL + C to exit");
- Gate gate = new Gate();
- new UserThread(gate, "Alice", "Alaska").start();
- new UserThread(gate, "Bobby", "Brazil").start();
- new UserThread(gate, "Chris", "Canada").start();
- }
- }
- /**
- * ShareResource 共享资源参于者
- * pass()方法与toString()方法的修饰符synchronized 确保资源的独享
- */
- class Gate {
- /** 保存的字段*/
- private int counter = 0;
- public String name ;
- public String address;
- /**
- * 线程安全方法
- * @param name String
- * @param address String
- */
- public synchronized void pass(String name, String address) {
- //1 2 3 4 的操作组合为原子级别的操作
- counter++; //1
- this.name = name ; //2
- this.address = address; //3
- check(); //4
- }
- /**
- * 线程安全方法
- * @return String
- */
- public synchronized String toString() {
- return "No" + counter + ":" + name + "," + address;
- }
- public void check() {
- if (name.charAt(0) != address.charAt(0)) {
- System.out.println("*****Broken*****" + toString());
- }
- }
- }
- /**
- * UseResource 资源使用者
- */
- class UserThread extends Thread{
- private final Gate gate;
- private final String myName;
- private final String myAddress;
- public UserThread(Gate gate, String myName, String myAddress) {
- this.gate = gate;
- this.myName = myName;
- this.myAddress = myAddress;
- }
- public void run() {
- while (true) {
- System.out.println(myName + " passing");
- gate.pass(myName, myAddress);
- }
- }
- }