將synchronized方法與物件作為鎖——T2105
阿新 • • 發佈:2021-01-13
package 物件及變數的併發訪問2;
/**
* 將synchronized方法與物件作為鎖
*
* 在methodA()方法前加入關鍵字synchronized進行同步處理,程式排隊執行,“共享”——只有共享資源的讀寫訪問才需要同步
* 化,如果不是共享資源,那麼就沒有同步的必要了。
*
* 結論:
* 1)A執行緒現持有object物件的Lock鎖,B執行緒可以以非同步的方式呼叫object物件中的非synchronized型別方法。
* 2)A執行緒先持有object物件的Lock鎖,B執行緒如果再這時呼叫object物件中的synchronized型別的方法。則需要等待,也就是同步
* 3)在方法宣告處新增synchronized並不是鎖方法,而是鎖當前類的物件
* 4)在java中只有“將物件作為鎖”這種說法,並不是“鎖方法”這種說法
* 5)在java語言中。 ”鎖“ 就是 ”物件“, ”物件“可以對映成”鎖“, 那個執行緒拿到這個把鎖,那個執行緒就可以執行這個物件中的synchronized同步方法
* 6)如果在X物件中使用了synchronized關鍵字宣告非靜態方法,則X物件就是被當成鎖。
*
*/
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
/**
* 測試
*/
class MyObjectT215{
synchronized public void methodA(){
try {
System.out.println("begin methA threadName="+Thread.currentThread().getName());
Thread.sleep(1000);
System. out.println("end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class MyObjet2T215{
synchronized public void methodA2(){
try {
System.out.println("begin methodA2 threadName="+Thread.currentThread().getName ());
Thread.sleep(5000);
System.out.println("end endTime="+System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized public void methodB2(){
try {
System.out.println("begin methodB2 threadName="+Thread.currentThread().getName()+" begin Time="+System.currentTimeMillis());
Thread.sleep(5000);
System.out.println("end");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class MyThreadAT215 extends Thread{
private MyObjectT215 object;
public MyThreadAT215(MyObjectT215 object){
super();
this.object=object;
}
@Override
public void run() {
super.run();
object.methodA();
}
}
class MyThreadA2T215 extends Thread{
private MyObjet2T215 objet2T215;
public MyThreadA2T215(MyObjet2T215 objet2T215){
super();
this.objet2T215=objet2T215;
}
@Override
public void run() {
super.run();
objet2T215.methodA2();
}
}
class MyThreadBT215 extends Thread{
private MyObjectT215 objectT215;
public MyThreadBT215(MyObjectT215 objectT215){
super();
this.objectT215=objectT215;
}
@Override
public void run() {
super.run();
objectT215.methodA();
}
}
class MyThreadB2T215 extends Thread{
private MyObjet2T215 objet2T215;
public MyThreadB2T215(MyObjet2T215 objet2T215){
super();
this.objet2T215=objet2T215;
}
@Override
public void run() {
super.run();
objet2T215.methodB2();
}
}
/**
* 執行
*/
class RunT215{
public RunT215(){
MyObjectT215 objectT215=new MyObjectT215();
MyThreadAT215 at215=new MyThreadAT215(objectT215);
at215.setName("A");
MyThreadBT215 bt215=new MyThreadBT215(objectT215);
bt215.setName("B");
at215.start();
bt215.start();
}
}
class Run2T215{
public Run2T215(){
MyObjet2T215 objet2T215=new MyObjet2T215();
MyThreadA2T215 a2T215=new MyThreadA2T215(objet2T215);
a2T215.setName("A");
MyThreadB2T215 b2T215=new MyThreadB2T215(objet2T215);
b2T215.setName("B");
a2T215.start();
b2T215.start();
}
}
public class T2105 {
public static void main(String[] args) throws InterruptedException {
// RunT215 runT215=new RunT215();
Run2T215 run2T215=new Run2T215();
}
}