Skip to content

Commit 5762222

Browse files
committed
update 0302
1 parent a19fa69 commit 5762222

File tree

11 files changed

+484
-0
lines changed

11 files changed

+484
-0
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
2+
package java0.conc0302.lock;
3+
4+
import java.util.concurrent.locks.ReentrantLock;
5+
6+
public class Count {
7+
8+
final ReentrantLock lock = new ReentrantLock();
9+
10+
public void get() {
11+
// final ReentrantLock lock = new ReentrantLock();
12+
try {
13+
lock.lock();
14+
System.out.println(Thread.currentThread().getName() + " get begin");
15+
Thread.sleep(1000);
16+
System.out.println(Thread.currentThread().getName() + " get end");
17+
lock.unlock();
18+
} catch (InterruptedException e) {
19+
e.printStackTrace();
20+
}
21+
}
22+
23+
public void put() {
24+
// final ReentrantLock lock = new ReentrantLock();
25+
try {
26+
lock.lock();
27+
System.out.println(Thread.currentThread().getName() + " put begin");
28+
Thread.sleep(1000);
29+
System.out.println(Thread.currentThread().getName() + " put end");
30+
lock.unlock();
31+
} catch (InterruptedException e) {
32+
e.printStackTrace();
33+
}
34+
}
35+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
2+
package java0.conc0302.lock;
3+
4+
import java.util.concurrent.locks.ReentrantReadWriteLock;
5+
6+
public class Count2 {
7+
8+
private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
9+
10+
public void get() {
11+
rwLock.readLock().lock();
12+
try {
13+
System.out.println(Thread.currentThread().getName() + " get begin");
14+
Thread.sleep(1000);
15+
System.out.println(Thread.currentThread().getName() + " get end");
16+
} catch (InterruptedException e) {
17+
e.printStackTrace();
18+
} finally {
19+
rwLock.readLock().unlock();
20+
}
21+
}
22+
23+
public void put() {
24+
rwLock.writeLock().lock();
25+
try {
26+
System.out.println(Thread.currentThread().getName() + " put begin");
27+
Thread.sleep(1000);
28+
System.out.println(Thread.currentThread().getName() + " put end");
29+
} catch (InterruptedException e) {
30+
e.printStackTrace();
31+
} finally {
32+
rwLock.writeLock().unlock();
33+
}
34+
}
35+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
2+
package java0.conc0302.lock;
3+
4+
public class Count3 {
5+
6+
private byte[] lock1 = new byte[1];
7+
private byte[] lock2 = new byte[1];
8+
9+
public int num = 0;
10+
11+
public void add() {
12+
synchronized (lock1) {
13+
try {
14+
Thread.sleep(1000);
15+
} catch (InterruptedException e) {
16+
e.printStackTrace();
17+
}
18+
synchronized (lock2) {
19+
num += 1;
20+
}
21+
System.out.println(Thread.currentThread().getName() + "_" + num);
22+
}
23+
}
24+
25+
public void lockMethod() {
26+
synchronized (lock2) {
27+
try {
28+
Thread.sleep(1000);
29+
} catch (InterruptedException e) {
30+
e.printStackTrace();
31+
}
32+
synchronized (lock1) {
33+
num += 1;
34+
}
35+
System.out.println(Thread.currentThread().getName() + "_" + num);
36+
}
37+
}
38+
39+
40+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
2+
package java0.conc0302.lock;
3+
4+
public class LockMain {
5+
6+
public static void main(String[] args) {
7+
Count3 count3 = new Count3();
8+
ThreadA threadA = new ThreadA(count3);
9+
threadA.setName("线程A");
10+
threadA.start();
11+
12+
ThreadB threadB = new ThreadB(count3);
13+
threadB.setName("线程B");
14+
threadB.start();
15+
16+
}
17+
18+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
2+
package java0.conc0302.lock;
3+
4+
import java.util.concurrent.Semaphore;
5+
import java.util.concurrent.locks.Lock;
6+
import java.util.concurrent.locks.ReentrantLock;
7+
8+
public class ObjectCache<T> {
9+
10+
public interface ObjectFactory<T> {
11+
T makeObject();
12+
}
13+
14+
class Node {
15+
T obj;
16+
Node next;
17+
}
18+
19+
final int capacity;
20+
final ObjectFactory<T> factory;
21+
final Lock lock = new ReentrantLock();
22+
final Semaphore semaphore;
23+
private Node head;
24+
private Node tail;
25+
26+
public ObjectCache(int capacity, ObjectFactory<T> factory) {
27+
this.capacity = capacity;
28+
this.factory = factory;
29+
this.semaphore = new Semaphore(this.capacity);
30+
this.head = null;
31+
this.tail = null;
32+
}
33+
34+
public T getObject() throws InterruptedException {
35+
semaphore.acquire();
36+
return getNextObject();
37+
}
38+
39+
private T getNextObject() {
40+
lock.lock();
41+
try {
42+
if (head == null) {
43+
return factory.makeObject();
44+
} else {
45+
Node ret = head;
46+
head = head.next;
47+
if (head == null) tail = null;
48+
ret.next = null;//help GC
49+
return ret.obj;
50+
}
51+
} finally {
52+
lock.unlock();
53+
}
54+
}
55+
56+
private void returnObjectToPool(T t) {
57+
lock.lock();
58+
try {
59+
Node node = new Node();
60+
node.obj = t;
61+
if (tail == null) {
62+
head = tail = node;
63+
} else {
64+
tail.next = node;
65+
tail = node;
66+
}
67+
68+
} finally {
69+
lock.unlock();
70+
}
71+
}
72+
73+
public void returnObject(T t) {
74+
returnObjectToPool(t);
75+
semaphore.release();
76+
}
77+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
2+
package java0.conc0302.lock;
3+
4+
public class ReentrantLockDemo {
5+
6+
public static void main(String[] args) {
7+
final Count count = new Count();
8+
9+
for (int i = 0; i < 2; i++) {
10+
new Thread() {
11+
public void run() {
12+
count.get();
13+
}
14+
}.start();
15+
}
16+
17+
for (int i = 0; i < 2; i++) {
18+
new Thread() {
19+
public void run() {
20+
count.put();
21+
}
22+
}.start();
23+
}
24+
}
25+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
2+
package java0.conc0302.lock;
3+
4+
public class ReentrantReadWriteLockDemo {
5+
6+
public static void main(String[] args) {
7+
final Count2 count = new Count2();
8+
9+
for (int i = 0; i < 5; i++) {
10+
new Thread() {
11+
public void run() {
12+
count.get();
13+
}
14+
}.start();
15+
}
16+
17+
for (int i = 0; i < 5; i++) {
18+
new Thread() {
19+
public void run() {
20+
count.put();
21+
}
22+
}.start();
23+
}
24+
}
25+
26+
/**
27+
*
28+
* Thread-0 get begin
29+
Thread-1 get begin
30+
Thread-2 get begin
31+
Thread-3 get begin
32+
Thread-4 get begin
33+
Thread-0 get end
34+
Thread-1 get end
35+
Thread-2 get end
36+
Thread-4 get end
37+
Thread-3 get end
38+
Thread-5 put begin
39+
Thread-5 put end
40+
Thread-6 put begin
41+
Thread-6 put end
42+
Thread-7 put begin
43+
Thread-7 put end
44+
Thread-8 put begin
45+
Thread-8 put end
46+
Thread-9 put begin
47+
Thread-9 put end
48+
*
49+
*/
50+
// 读锁不互斥、写锁互斥
51+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
2+
package java0.conc0302.lock;
3+
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
import java.util.concurrent.locks.ReentrantReadWriteLock;
7+
8+
public class ReentrantReadWriteLockDemo2 {
9+
10+
private final Map<String, Object> map = new HashMap<>();
11+
12+
private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
13+
14+
public Object readWrite(String key) {
15+
Object value = null;
16+
System.out.println("1.首先开启读锁去缓存中取数据");
17+
rwLock.readLock().lock();
18+
try {
19+
value = map.get(key);
20+
if (value == null) {
21+
System.out.println("2.数据不存在,则释放读锁,开启写锁");
22+
rwLock.readLock().unlock();
23+
rwLock.writeLock().lock();
24+
try {
25+
if (value == null) {
26+
value = "aaaa";
27+
}
28+
} finally {
29+
System.out.println("3.释放写锁");
30+
rwLock.writeLock().unlock();
31+
}
32+
System.out.println("4.开启读锁");
33+
rwLock.readLock().lock();
34+
}
35+
} finally {
36+
System.out.println("5.释放读锁");
37+
rwLock.readLock().unlock();
38+
}
39+
return value;
40+
}
41+
42+
public static void main(String[] args) {
43+
ReentrantReadWriteLockDemo2 demo2 = new ReentrantReadWriteLockDemo2();
44+
demo2.readWrite("wangwei");
45+
}
46+
47+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
2+
package java0.conc0302.lock;
3+
4+
public class ThreadA extends Thread {
5+
private Count3 count3;
6+
7+
public ThreadA(Count3 count3) {
8+
this.count3 = count3;
9+
}
10+
11+
public void run() {
12+
count3.add();
13+
}
14+
15+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
2+
package java0.conc0302.lock;
3+
4+
public class ThreadB extends Thread {
5+
private Count3 count3;
6+
7+
public ThreadB(Count3 count3) {
8+
this.count3 = count3;
9+
}
10+
11+
public void run() {
12+
count3.lockMethod();
13+
}
14+
15+
}

0 commit comments

Comments
 (0)