Service:
package thread; public class Service implements Runnable{ //共享资源 private int count = 0; @Override public void run() { operateCount(); } //多线程操作共享资源的方法 /* synchronized */ private void operateCount() { //打印当前线程获取到的值,即 读 System.out.println(Thread.currentThread().getName()+"--get--count:"+count); try { //取一个0到1000的随机数 int r = (int) (Math.random()*1000); Thread.sleep(r); //修改值 count=r; } catch (Exception e) { e.printStackTrace(); } //打印当前线程修改后的值,即 写 System.out.println(Thread.currentThread().getName()+"--set--count:"+count); } }
test:
package thread; public class T { public static void main(String[] args) { Service service = new Service(); new Thread(service).start(); new Thread(service).start(); new Thread(service).start(); } }
结果:
不加同步:
Thread-0--get--count:0
Thread-2--get--count:0
Thread-1--get--count:0
Thread-1--set--count:340
Thread-2--set--count:514
Thread-0--set--count:803
说明,3个线程同时获取到了初始值0,然后分别把0改为自己对应的值。线程不安全。
加同步后:
Thread-0--get--count:0
Thread-0--set--count:745
Thread-2--get--count:745
Thread-2--set--count:978
Thread-1--get--count:978
Thread-1--set--count:575
说明,3个线程是按顺序执行的,第一次0线程获取到了0,然后执行设置值操作,然后2线程读到了已经被0线程修改后的值,再次进行修改。。。。,这个是线程安全的。