Java多線程中使用synchronized說明
1.在類中方法上加上
synchronized關(guān)鍵字,是對整個(gè)對象加鎖,當(dāng)一個(gè)線程訪問帶有synchronized的方法時(shí),其他帶有synchronized的方法的訪問就都會阻塞。
樣例:
public class ThreadTest {
public static void main(String[] args) {
Stu stu = new Stu();
StuThread1 t1 = new StuThread1(stu);
t1.start();
StuThread2 t2 = new StuThread2(stu);
t2.start();
}
}
class StuThread1 extends Thread {
Stu stu;
public StuThread1(Stu stu) {
this.stu = stu;
}
public void run() {
stu.read1();
}
}
class StuThread2 extends Thread {
Stu stu;
public StuThread2(Stu stu) {
this.stu = stu;
}
public void run() {
stu.read2();
}
}
class Stu {
public synchronized void read1() {
System.out.println("read1 begin");
try {
Thread.currentThread()。sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("read1 end");
}
public synchronized void read2() {
System.out.println("read2 begin");
try {
Thread.currentThread()。sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("read2 end");
}
}
打印結(jié)果為(兩個(gè)線程是順序執(zhí)行的):
read1 begin
read1 end
read2 begin
read2 end
如果去掉read2前面的synchronized關(guān)鍵字,打印為(線程出現(xiàn)了交叉執(zhí)行):
read1 begin
read2 begin
read2 end
read1 end
修改read2方法,
public void read2() {
synchronized(this)
{
System.out.println("read2 begin");
try {
Thread.currentThread()。sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("read2 end");
}
}
對this進(jìn)行加鎖,結(jié)果同一次,線程是順序執(zhí)行的托福答案