synchronized【Java】中使用的demo
没有synchronized的效果:
package Action; public class syn { static int count=10; static Object lock=new Object(); public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { while (true) { if(count<=0) { System.out.println("内部线程:结束"); break; } // synchronized(lock) { count--; System.out.println("内部线程:"+count); // } try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }).start(); while (true) { if(count<=0) { System.out.println("外部线程:结束"); break; } // synchronized (lock) { count--; System.out.println("外部线程:"+count); // } try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
很明显,在没有使用【锁】的时候数据出现了错误。
有synchronized的效果:
package Action; public class syn { static int count=10; static Object lock=new Object(); public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { while (true) { if(count<=0) { System.out.println("内部线程:结束"); break; } synchronized(lock) { count--; System.out.println("内部线程:"+count); } try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }).start(); while (true) { if(count<=0) { System.out.println("外部线程:结束"); break; } synchronized (lock) { count--; System.out.println("外部线程:"+count); } try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
效果很明显,没有数据错误。
synchronized不仅可以修饰代码块,还可以修饰方法、实例对象、class对象。
如果锁的是类对象的话,尽管new多个实例对象,但他们仍然是属于同一个类依然会被锁住,即线程之间保证同步关系。