class UserEvent { Object source; public UserEvent(Object source) {this.source = source;} public Object getSource() {return source;} } interface UserEventListener { void performUserEvent(UserEvent e); } class UserData { int a = 0; List<UserEventListener> envetList = new ArrayList<UserEventListener>(); public UserData(int a) {this.a = a;} public int getData() {return a;} public boolean addUserEventListener(UserEventListener uel) { synchronized(eventlist) {return eventList.add(uel);} } public boolean removeUserEventListener(UserEventListener uel) { synchronized(eventlist) {return eventList.remove(uel);} } public void changeData(int v) { if (v == a) return; a = v; UserEvent event = new UserEvent(this); List<UserEventListener> tmpList; synchrozied (eventList) { tmpList = new ArrayList<UserEventListener>(eventList); } for (UserEventListener uel : tmpList) { uel.performUserEvent(event); } } } public class Test { public static void main(String[] args) { UserData ud = new UserData(100); ud.addUserEventListener(new UserEventListener() { public void performUserEvent(UserEvent e) { Object obj = e.getSource(); if (obj instanceof UserData) { System.out.println(((UserData)obj).getData()); } } }); System.out.println("before data change"); ud.changeData(200); System.out.println("after data change"); } }