概念:
類鎖:所有對(duì)象共用一個(gè)鎖
對(duì)象鎖:一個(gè)對(duì)象一把鎖,多個(gè)對(duì)象多把鎖。
一、synchronized修飾普通方法(對(duì)象鎖)
測(cè)試代碼:
class B{
synchronized public void mB(String value) {
for (int i = 0; i < 10; i++) {
System.out.println(value);
try{
Thread.sleep(150);
}catch(Exception e){
}
}
}
synchronized public void mC(String value) {
for (int i = 0; i < 10; i++) {
System.out.println(value);
try{
Thread.sleep(150);
}catch(Exception e){
}
}
}
}
public class Main {
public static void main(String[] agrs){
System.out.println("Main 線程 開始運(yùn)行!");
final B b1 = new B();
Thread t1 = new Thread(){
@Override
public void run(){
System.out.println("t1 開始運(yùn)行!");
b1.mB("HAHA");
System.out.println("t1 結(jié)束運(yùn)行!");
}
};
t1.start();
Thread t2 = new Thread(){
@Override
public void run(){
System.out.println("t2 開始運(yùn)行!");
b1.mC("XIXI");
System.out.println("t2 結(jié)束運(yùn)行!");
}
};
t2.start();
System.out.println("Main 線程 結(jié)束運(yùn)行!");
}
}
打印結(jié)果:
Main 線程 開始運(yùn)行!
Main 線程 結(jié)束運(yùn)行!
t1 開始運(yùn)行!
HAHA
t2 開始運(yùn)行!
HAHA
HAHA
HAHA
HAHA
HAHA
HAHA
HAHA
HAHA
HAHA
t1 結(jié)束運(yùn)行!
XIXI
XIXI
XIXI
XIXI
XIXI
XIXI
XIXI
XIXI
XIXI
XIXI
t2 結(jié)束運(yùn)行!
結(jié)論:修飾普通方法的時(shí)候,鎖的是當(dāng)前對(duì)象。
如果創(chuàng)建個(gè)新對(duì)象b2,則不能保持同步??!
例如下面的代碼,無(wú)法保持同步?。?!
public class Main {
public static void main(String[] agrs){
System.out.println("Main 線程 開始運(yùn)行!");
final B b1 = new B();
Thread t1 = new Thread(){
@Override
public void run(){
System.out.println("t1 開始運(yùn)行!");
b1.mB("HAHA");
System.out.println("t1 結(jié)束運(yùn)行!");
}
};
t1.start();
final B b2 = new B();
Thread t2 = new Thread(){
@Override
public void run(){
System.out.println("t2 開始運(yùn)行!");
b2.mC("XIXI");
System.out.println("t2 結(jié)束運(yùn)行!");
}
};
t2.start();
System.out.println("Main 線程 結(jié)束運(yùn)行!");
}
}
二、synchronized修飾靜態(tài)方法(類鎖)
B 類修改為如下:
class B{
synchronized static public void mB(String value) {
for (int i = 0; i < 10; i++) {
System.out.println(value);
try{
Thread.sleep(150);
}catch(Exception e){
}
}
}
synchronized static public void mC(String value) {
for (int i = 0; i < 10; i++) {
System.out.println(value);
try{
Thread.sleep(150);
}catch(Exception e){
}
}
}
}
結(jié)論:就算兩個(gè)不同的對(duì)象,也可以保持同步?。。?/p>
三、synchronized修飾代碼塊(也分類鎖、對(duì)象鎖)
class B{
public void mB(String value) {
synchronized(B.class){
for (int i = 0; i < 10; i++) {
System.out.println(value);
try{
Thread.sleep(150);
}catch(Exception e){
}
}
}
}
public void mC(String value) {
synchronized(B.class){
for (int i = 0; i < 10; i++) {
System.out.println(value);
try{
Thread.sleep(150);
}catch(Exception e){
}
}
}
}
}
上面是類鎖:所有對(duì)象可以保持同步。
class B{
public void mB(String value) {
synchronized(this){
for (int i = 0; i < 10; i++) {
System.out.println(value);
try{
Thread.sleep(150);
}catch(Exception e){
}
}
}
}
public void mC(String value) {
synchronized(this){
for (int i = 0; i < 10; i++) {
System.out.println(value);
try{
Thread.sleep(150);
}catch(Exception e){
}
}
}
}
}
上面是對(duì)象鎖:同一對(duì)象可以保持同步,不同對(duì)象不可保持同步。