//java锁是对同一个对象或者同一个对象中的方法加锁;关键是同一个
错误的加锁方式
public class MyWaitNotify {public static void main(String[] args) {MyT m1=new MyT("A");MyT m2=new MyT("B");m1.start();m2.start();} } class MyT extends Thread{String name; public MyT(String name) {this.name=name; } @Override public void run() {sys(); }public void sys(){synchronized(this)//this只是对此次new的对象加锁,new两个对象,this表示不同,加锁失败{for(int i=0;i<1000;i++){System.out.println(name +" "+i);} }} }
正确的加锁方式
public class MyWaitNotify { static Object o=new Object();//加锁的对象, public static void main(String[] args) { MyT m1=new MyT("A",o);//m1.m2同时使用一个对象 MyT m2=new MyT("B",o); m1.start(); m2.start(); } } class MyT extends Thread{ String name; Object o; public MyT(String name,Object o) { this.name=name; this.o=o; } @Override public void run() { sys(); } public void sys() { synchronized(o) { for(int i=0;i<1000;i++) { try { sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(name +" "+i); } } } }