そんなこと知ってる
コードのブロックを同期するときは、ロックとして使用するオブジェクトのロックを指定します。たとえば、サードパーティ オブジェクトをこのコードのロックとして使用できます。これにより、1 つのオブジェクト内でコードを同期するために複数のロックを設定できます。
ただし、ブロックに引数を渡す必要性がわかりません。String のインスタンスを渡すかどうかは問題ではないため、同期ブロックはブロックに渡されるパラメーターに関係なく完全に機能するため、一部のランダム クラスのインスタンスが同期ブロックに渡されます。
したがって、私の質問は、とにかく同期ブロックが2つのスレッドが同時にクリティカルセクションに入るのを防ぐかどうかです。次に、なぜ引数を渡す必要があるのか。(つまり、デフォルトでランダムなオブジェクトのロックを取得します)。
質問が正しく構成されていることを願っています。
次の例を、同期ブロックに対するランダム パラメータを使用して試しました。
public class Launcher {
public static void main(String[] args) {
AccountOperations accOps=new AccountOperations();
Thread lucy=new Thread(accOps,"Lucy");
Thread sam=new Thread(accOps,"Sam");
lucy.start();
sam.start();
}
}
非静的同期ブロックの使用:
public class AccountOperations implements Runnable{
private Account account = new Account();
public void run(){
for(int i=0;i<5;i++){
makeWithdrawal(10);
}
}
public void makeWithdrawal(int amount){
String str="asd"
synchronized (str /* pass any non-null object the synchronized block works*/) {
if(account.getAmount()>10){
try{
Thread.sleep(5000);
}catch(InterruptedException e){
e.printStackTrace();
}
account.withdraw(amount);
System.out.println(Thread.currentThread().getName()+" has withdrawn 10, current balance "+ account.getAmount());
}else{
System.out.println("Insufficient funds "+account.getAmount());
}
}
}
}
静的同期ブロックの使用:
public class AccountOperations implements Runnable{
private static Account account = new Account();
public void run(){
for(int i=0;i<5;i++){
makeWithdrawal(10);
}
}
public static void makeWithdrawal(int amount){
synchronized (String.class /* pass any class literal synchronized block works*/) {
if(account.getAmount()>10){
try{
Thread.sleep(5000);
}catch(InterruptedException e){
e.printStackTrace();
}
account.withdraw(amount);
System.out.println(Thread.currentThread().getName()+" has withdrawn 10, current balance "+ account.getAmount());
}else{
System.out.println("Insufficient funds "+account.getAmount());
}
}
}
}