String型別作為鎖的弊端
阿新 • • 發佈:2019-02-06
結果package com.freeflying.thread.sync; /** * 使用String型別作為鎖 * @ClassName: ConstantPoolString * @Description: * @author freeflying * @date 2018年7月5日 */ public class ConstantPoolString { public static void main(String[] args) { ConstantPoolStringEx constantPoolStringEx=new ConstantPoolStringEx(); ConstantPoolStringA constantPoolStringA=new ConstantPoolStringA(constantPoolStringEx); constantPoolStringA.setName("A"); constantPoolStringA.start(); ConstantPoolStringB constantPoolStringB=new ConstantPoolStringB(constantPoolStringEx); constantPoolStringB.setName("B"); constantPoolStringB.start(); } } class ConstantPoolStringEx{ public static void print(String string) { try { synchronized (string) { while (true) { System.out.println(Thread.currentThread().getName()); Thread.sleep(1000); } } } catch (Exception e) { // TODO: handle exception } } } class ConstantPoolStringA extends Thread{ private ConstantPoolStringEx constantPoolStringEx; public ConstantPoolStringA(ConstantPoolStringEx constantPoolStringEx) { this.constantPoolStringEx=constantPoolStringEx; } @Override public void run() { constantPoolStringEx.print("AA"); } } class ConstantPoolStringB extends Thread{ private ConstantPoolStringEx constantPoolStringEx; public ConstantPoolStringB(ConstantPoolStringEx constantPoolStringEx) { this.constantPoolStringEx=constantPoolStringEx; } @Override public void run() { constantPoolStringEx.print("AA"); } }
A
A
A
A
A
A
A
A
A
A
A
A
結論:因為在JVM中具有String常量池(如果兩個String具有相同的值,那麼他們的地址是相同的,都儲存在這個常量池中)。當以String作為鎖的時候,如果值相同則,那麼執行緒持有相同的鎖。這樣就造成了另外一個執行緒不能執行