synchronized与lock

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class TestLock {
	private static Lock lock = new ReentrantLock();
	private int id;
	private static User user = new User();
	private Log log = LogFactory.getLog(TestLock.class);
	TestLock(int id){
		this.id = id;
	}
	public void inc(long cur,int id){
		//lock.lock();
		user.cur = cur;
		log.info("线程" + id + "传入"+  cur);
		
		log.info("线程" + id + "获取"+  user.cur);
		//lock.unlock();
	}
	public Lock getLock(){
		return lock;
	}
	

}

import java.util.Random;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;



public class TestClient {
	IncThread t1,t2,t3,t4;
	private Log log = LogFactory.getLog(TestClient.class);
	TestClient(){
		t1 = new IncThread(1);
		t2 = new IncThread(2);
		t3 = new IncThread(3);
		t4 = new IncThread(4);
		
	}
	public void test(){
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
	class IncThread extends Thread{
		int id;
		IncThread(int id){
			this.id = id;
		}
		public void run(){
			TestLock t = new TestLock(id);
			
			for(int i=0; i<10;i++){
				Random a = new Random();
				int cur = a.nextInt(100)+1;
				log.info("线程"+id+ "生成" + cur);
				t.inc(cur,id);					
			}			
		}
	}
	
	public static void main(String args[]){
		TestClient client = new TestClient();
		client.test();
		System.out.println("3333333");
		
	}
}




output:
3333333
2013-04-06 16:07:32 [dingchd.multithread.TestClient-36]-[INFO] 线程4生成26
2013-04-06 16:07:32 [dingchd.multithread.TestClient-36]-[INFO] 线程2生成58
2013-04-06 16:07:32 [dingchd.multithread.TestClient-36]-[INFO] 线程3生成69
2013-04-06 16:07:32 [dingchd.multithread.TestClient-36]-[INFO] 线程1生成53
2013-04-06 16:07:32 [dingchd.multithread.TestLock-20]-[INFO] 线程3传入69
2013-04-06 16:07:32 [dingchd.multithread.TestLock-22]-[INFO] 线程3获取53

线程3 传入69之后,获取的是线程1传入的值,未同步;
加上lock锁之后的output:
3333333
2013-04-06 16:18:17 [dingchd.multithread.TestClient-40]-[INFO] 线程1生成27
2013-04-06 16:18:17 [dingchd.multithread.TestClient-40]-[INFO] 线程2生成22
2013-04-06 16:18:17 [dingchd.multithread.TestClient-40]-[INFO] 线程4生成95
2013-04-06 16:18:17 [dingchd.multithread.TestClient-40]-[INFO] 线程3生成6
2013-04-06 16:18:17 [dingchd.multithread.TestLock-20]-[INFO] 线程1传入27
2013-04-06 16:18:17 [dingchd.multithread.TestLock-22]-[INFO] 线程1获取27
2013-04-06 16:18:17 [dingchd.multithread.TestClient-40]-[INFO] 线程1生成7
2013-04-06 16:18:17 [dingchd.multithread.TestLock-20]-[INFO] 线程1传入7
2013-04-06 16:18:17 [dingchd.multithread.TestLock-22]-[INFO] 线程1获取7
传入和获取是同步的,加锁了

注:此处的Lock是static类型的

代码改为如下也启动同步作用:
public static synchronized void inc(long cur,int id){
		//lock.lock();
		user.cur = cur;
		log.info("线程"+ id +"传入"+  cur);
		
		log.info("线程"+ id + "获取"+  user.cur);
		//lock.unlock();
	}



代码改为如下也可以:
public class TestLock {
	private static Lock lock = new ReentrantLock();
	private static Object obj = new Object();
	private int id;
	private static User user = new User();
	private static Log log = LogFactory.getLog(TestLock.class);
	TestLock(int id){
		this.id = id;
	}
	public void inc(long cur,int id){
		//lock.lock();
		synchronized(obj){
			user.cur = cur;
			log.info("线程"+ id +"传入"+  cur);
			
			log.info("线程"+ id + "获取"+  user.cur);
		}
		//lock.unlock();
	}
}



区别:lock相比synchronized更高效,需手动释放,一个隐式一个显式,一个关键字一个类库方法

数据如下:(http://itcxy.com/base/jprove/2012/1221/459.html)
Threads 1x
synch 1x
Lock 1x
AtomicInteger 2x
synch 2x
Lock 2x
AtomicInteger
1 1.797 2.175 0.947 3.246 4.111 1.703
2 8.685 4.134 1.889 13.144 4.901 1.949
4 7.942 3.040 1.735 13.182 4.960 1.945
8 7.648 3.011 1.894 13.287 4.979 1.951
16 8.017 2.974 1.735 13.040 4.573 1.950
32 7.908 2.958 1.777 13.059 4.845 1.958
64 7.853 2.972 1.878 13.316 5.004 1.954

你可能感兴趣的:(java)