线程安全保证最好的办法是加锁,然而对于盲目的加锁直接导致安全访
问数据,但是代价
确实经常的加减锁。让性能变得差劲。所以这里需要权衡加锁的范围,也就是安全与性能的较量。
public class Down extends Thread{
static DownloadEntity downloadEntity=new DownloadEntity();
public static void main(String args[])
{
for(int i=0;i<100;i++) {
Down down=new Down();
down.start();
}
Down.print();
}
public void run()
{
downloadEntity.get(System.currentTimeMillis());
}
public static void print()
{
System.out.print(downloadEntity.get(System.currentTimeMillis()));
}
}
public class DownloadEntity {
int count;
public synchronized int get(long time){
count++;
saveTimeLog(time);
return count++;
}
void saveTimeLog(long time)
{
Date date=new Date(time);
insertIntoDB(date);
}
void insertIntoDB(Date date)
{
System.out.println(date);
}
}
这里看到还是之前的代码,代码在每一次访问计数功能需要加1,
当多线程加 1 需要利用锁维持准确,
这里我们由于记录当前时间也就是模拟保存数据库的时候看一下这些
代码。
public int get(long time){
saveTimeLog(time);
synchronized (this) {
count++;
return count;
}
}
因为这里保存数据库的额度,或者说范围是栈上的变量控制,
每一个线程访问无需上锁,这里抽出来不但是安全的,而且在性能
有所改善。
也就是常见的抽离,真正需要上锁的才去加锁