直接上代码
package Thread.Synchronized; public class Service { private String usernameParam; private String passwordParam; public void setUsernamePassword(String username, String password) { try { String anyString = new String(); synchronized (anyString) { System.out.println("线程名称:"+Thread.currentThread().getName()+"在"+System.currentTimeMillis()+"进入同步块"); usernameParam = username; Thread.sleep(2000); passwordParam = password; System.out.println("线程名称:"+Thread.currentThread().getName()+"在"+System.currentTimeMillis()+"离开同步块"); } } catch(InterruptedException e) { e.printStackTrace(); } } }
package Thread.Synchronized; public class ThreadA extends Thread { private Service service; public ThreadA(Service service) { super(); this.service = service; } public void run() { service.setUsernamePassword("a","aa"); } }
package Thread.Synchronized; public class ThreadB extends Thread { private Service service; public ThreadB(Service service) { super(); this.service = service; } public void run() { service.setUsernamePassword("b","bb"); } }
package Thread.Synchronized; public class Run { public static void main(String args[]) { Service service = new Service(); ThreadA a = new ThreadA(service); ThreadB b = new ThreadB(service); a.setName("A"); b.setName("B"); a.start(); b.start(); } }
执行之后的结果如下图所示
线程名称:A在1533020323863进入同步块
线程名称:B在1533020323863进入同步块
线程名称:A在1533020325884离开同步块
线程名称:B在1533020325884离开同步块
synchronized关键字锁定的对象是在每次进入函数之后new出来的一个对象,所以synchronized(非this对象)的对象监视器不是同一个对象,所以运行结果就是异步的了,就会交叉运行