一、題目描述
我們提供了一個類:
public class Foo {
public void one() { print("one"); }
public void two() { print("two"); }
public void three() { print("three"); }
}
三個不同的線程將會共用一個 Foo 實例桨醋。
線程 A 將會調(diào)用 one() 方法
線程 B 將會調(diào)用 two() 方法
線程 C 將會調(diào)用 three() 方法
請設(shè)計修改程序棚瘟,以確保 two() 方法在 one() 方法之后被執(zhí)行,three() 方法在 two() 方法之后被執(zhí)行喜最。
示例 1:
輸入: [1,2,3]
輸出: "onetwothree"
解釋:
有三個線程會被異步啟動偎蘸。
輸入 [1,2,3] 表示線程 A 將會調(diào)用 one() 方法,線程 B 將會調(diào)用 two() 方法瞬内,線程 C 將會調(diào)用 three() 方法禀苦。
正確的輸出是 "onetwothree"。
示例 2:
輸入: [1,3,2]
輸出: "onetwothree"
解釋:
輸入 [1,3,2] 表示線程 A 將會調(diào)用 one() 方法遂鹊,線程 B 將會調(diào)用 three() 方法振乏,線程 C 將會調(diào)用 two() 方法。
正確的輸出是 "onetwothree"秉扑。
注意:
盡管輸入中的數(shù)字似乎暗示了順序慧邮,但是我們并不保證線程在操作系統(tǒng)中的調(diào)度順序。
你看到的輸入格式主要是為了確保測試的全面性舟陆。
二误澳、程序?qū)嵗?/h1>
執(zhí)行用時:12ms,內(nèi)存消耗:7.6MB
typedef struct {
// User defined data may be declared here.
pthread_mutex_t lock1;
pthread_mutex_t lock2;
} Foo;
Foo* fooCreate() {
Foo* obj = (Foo*) malloc(sizeof(Foo));
// Initialize user defined data here.
pthread_mutex_init(&obj->lock1, NULL);
pthread_mutex_init(&obj->lock2, NULL);
pthread_mutex_lock(&obj->lock1);
pthread_mutex_lock(&obj->lock2);
return obj;
}
void first(Foo* obj) {
// printFirst() outputs "first". Do not change or remove this line.
printFirst();
pthread_mutex_unlock(&obj->lock1);
}
void second(Foo* obj) {
pthread_mutex_lock(&obj->lock1);
// printSecond() outputs "second". Do not change or remove this line.
printSecond();
pthread_mutex_unlock(&obj->lock2);
}
void third(Foo* obj) {
pthread_mutex_lock(&obj->lock2);
// printThird() outputs "third". Do not change or remove this line.
printThird();
pthread_mutex_unlock(&obj->lock2);
}
void fooFree(Foo* obj) {
// User defined data may be cleaned up here.
free(obj);
}