1:lock和synchronized对比
1. import java.util.concurrent.locks.Lock;
2. import java.util.concurrent.locks.ReentrantLock;
3.
4.
5. public class LockTest {
6.
7. /**
8. * @param args
9. */
10. public static void main(String[] args) {
11. new LockTest().init();
12. }
13.
14. private void init(){
15. final Outputer outputer = new Outputer();
16. new Thread(new Runnable(){
17. @Override
18. public void run() {
19. while(true){
20. try {
21. 10);
22. catch (InterruptedException e) {
23. // TODO Auto-generated catch block
24. e.printStackTrace();
25. }
26. "zhangxiaoxiang");
27. }
28.
29. }
30. }).start();
31.
32. new Thread(new Runnable(){
33. @Override
34. public void run() {
35. while(true){
36. try {
37. 10);
38. catch (InterruptedException e) {
39. // TODO Auto-generated catch block
40. e.printStackTrace();
41. }
42. "lihuoming");
43. }
44.
45. }
46. }).start();
47.
48. }
49.
50. static class Outputer{
51. new ReentrantLock();
52. public void output(String name){
53. int len = name.length();
54. lock.lock();
55. try{
56. for(int i=0;i<len;i++){
57. System.out.print(name.charAt(i));
58. }
59. System.out.println();
60. finally{
61. lock.unlock();
62. }
63. }
64.
65. public synchronized void output2(String name){
66. int len = name.length();
67. for(int i=0;i<len;i++){
68. System.out.print(name.charAt(i));
69. }
70. System.out.println();
71. }
72.
73. public static synchronized void output3(String name){
74. int len = name.length();
75. for(int i=0;i<len;i++){
76. System.out.print(name.charAt(i));
77. }
78. System.out.println();
79. }
80. }
81. }
2.读写锁:ReadWriteLock
1. import java.util.Random;
2. import java.util.concurrent.locks.ReadWriteLock;
3. import java.util.concurrent.locks.ReentrantReadWriteLock;
4.
5. public class ReadWriteLockTest {
6. public static void main(String[] args) {
7. final Queue3 q3 = new Queue3();
8. for(int i=0;i<3;i++)
9. {
10. new Thread(){
11. public void run(){
12. while(true){
13. q3.get();
14. }
15. }
16.
17. }.start();
18.
19. new Thread(){
20. public void run(){
21. while(true){
22. new Random().nextInt(10000));
23. }
24. }
25.
26. }.start();
27. }
28.
29. }
30. }
31.
32. class Queue3{
33. private Object data = null;//共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。
34. new ReentrantReadWriteLock();
35. public void get(){
36. rwl.readLock().lock();
37. try {
38. " be ready to read data!");
39. long)(Math.random()*1000));
40. "have read data :" + data);
41. catch (InterruptedException e) {
42. e.printStackTrace();
43. finally{
44. rwl.readLock().unlock();
45. }
46. }
47.
48. public void put(Object data){
49.
50. rwl.writeLock().lock();
51. try {
52. " be ready to write data!");
53. long)(Math.random()*1000));
54. this.data = data;
55. " have write data: " + data);
56. catch (InterruptedException e) {
57. e.printStackTrace();
58. finally{
59. rwl.writeLock().unlock();
60. }
61.
62.
63. }
64. }
3.用写锁实现库存递减
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class ReadWriteLockTest {
public static boolean flag = true;
public static void main(String[] args) {
final Queue3 q3 = new Queue3();
for (int i = 0; i < 3; i++) {
new Thread() {
public void run() {
while (ReadWriteLockTest.flag) {
q3.put();
}
}
}.start();
}
}
}
class Queue3 {
private Integer data = 10;// 共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。
final ReadWriteLock lock = new ReentrantReadWriteLock();
public void put() {
lock.writeLock().lock();// 写锁开启,这时只有一个写线程进入
try {
System.out.println(Thread.currentThread().getName() + " have write data: " + data);
if (data == 0) {
ReadWriteLockTest.flag = false;
return;
}
data--;
} finally {
lock.writeLock().unlock();
}
}
}
4.用读写锁实现一个简单缓存机制
1. import java.util.HashMap;
2. import java.util.Map;
3. import java.util.concurrent.locks.ReadWriteLock;
4. import java.util.concurrent.locks.ReentrantReadWriteLock;
5.
6. public class CacheDemo {
7.
8. private Map<String, Object> cache = new HashMap<String, Object>();
9. public static void main(String[] args) {
10. // TODO Auto-generated method stub
11.
12. }
13.
14. private ReadWriteLock rwl = new ReentrantReadWriteLock();
15. public Object getData(String key){
16. rwl.readLock().lock();
17. null;
18. try{
19. value = cache.get(key);
20. if(value == null){
21. rwl.readLock().unlock();
22. rwl.writeLock().lock();
23. try{
24. if(value==null){
25. "aaaa";//实际失去queryDB();
26. }
27. finally{
28. rwl.writeLock().unlock();
29. }
30. rwl.readLock().lock();
31. }
32. finally{
33. rwl.readLock().unlock();
34. }
35. return value;
36. }
37. }