請關注“知了堂學習社區”,地址:http://www.zhiliaotang.com/portal.php
鎖:保護資源—-資源:衛生間、線程:上衛生間的人、鎖:衛生間的門
一把鎖只有一把鑰匙
只有執行完被鎖住的程序塊鑰匙才能被釋放
鎖保護誰:成員屬性/靜態成員屬性
鎖有幾種:this—-當前對象的鎖
package thread;
public class Thread_6 {
/**
* @param args
*/
public static void main(String[] args) {
final Method m = new Method();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
m.m1();
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
m.m2();
}
});
t1.start();
t2.start();
}
}
class Method{
public void m1(){
synchronized (this) {
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
public void m2(){
synchronized (this) {
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
}
類.class—-當前類的class對象的鎖
成員屬性
方法上加鎖—-鎖就是this對象的鎖
靜態方法加鎖—-class實例的鎖
鎖屬於誰:
鎖是屬於對象的
每一個對象都有一把唯一的鎖
package thread;
public class Thread_5 {
/**
* @param args
*/
public static void main(String[] args) {
SaleTask sale = new SaleTask();
Thread t1 = new Thread(sale);
t1.setName("網絡");
Thread t2 = new Thread(sale);
t2.setName("電話");
Thread t3 = new Thread(sale);
t3.setName("現場");
t1.start();
t2.start();
t3.start();
}
}
class SaleTask implements Runnable{
int id = 100;
@Override
public void run() {
while(true){
synchronized (this) {//t1,t2,t3拿到鑰匙,且只有一把鑰匙
if(id>0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("賣票"+id--);
}else{
System.out.println("票賣完");
break;
}
}//運行到這裏歸還鑰匙
}
}
}