8:30——9:00单词time!
9:00——11:30JAVA学习
14:30——18:00第二周vj题
19:00——21:00第二周vj题
JAVA学习
多线程中的lock锁
Lock接口的基本特性
1、尝试非阻塞地获取锁
2、能被中断地获取锁
3、超时获取锁
解释:1:即当前线程尝试获取锁,如果这一时刻锁没有被其他线程获取到,则成功获取并持有锁
意思就相当于推门,看门有没有被别人锁上。
2:获取到锁的线程能够响应中断,当获取到锁的线程被中断时,中断异常将会被抛出,同时锁会被释放
3:在指定时间前获取锁,如果此时门已锁上,则直接返回
Lock常见方法
void lock() 获得锁。如果锁不可用,则当前线程将被禁用以进行线程调度,并处于休眠状态,直到获取锁。
void lockInterruptibly() 获取锁,如果可用并立即返回。如果锁不可用,那么当前线程将被禁用以进行线程调度,并且处于休眠状态,和lock()方法不同的是在锁的获取中可以中断当前线程(相应中断。
Condition newCondition() 获取等待通知组件,该组件和当前的锁绑定,当前线程只有获得了锁,才能调用该组件的wait()方法,而调用后,当前线程将释放锁。
boolean tryLock() 只有在调用时才可以获得锁。如果可用,则获取锁定,并立即返回值为true;如果锁不可用,则此方法将立即返回值为false 。
boolean tryLock(long time, TimeUnit unit) 超时获取锁,当前线程在一下三种情况下会返回: 1. 当前线程在超时时间内获得了锁;2.当前线程在超时时间内被中断;3.超时时间结束,返回false.
void unlock() 释放锁。
使用Lock同步的格式
Lock lock = ...;
lock.lock();
try{
//处理任务
}catch(Exception ex){
}finally{
lock.unlock(); //释放锁
}
刷题
M题
这道题很简单可以直接用暴力解法直接求解
以下为部分代码
for(int i=0;a*i<=n;i++)
{
for(int j=0;a*i+b*j<=n;j++)
{
if((n-a*i-b*j)%c==0)
ans=max(ans,(n-a*i-b*j)/c+i+j);
}
}
a,b,c为输入的三个值
F题
这题我看了很久。。。。。始终不理解怎么优化算法时间到nlgn。。。看了很多题解也没找到能看懂的最后问了大佬才搞明白。。先贴代码
for(int i=2; i<=n; i++)
{
if(a[i] > dp[max1])
{
dp[++max1] = a[i];
}
else
{
int low = 1,high = max1;
while(low <= high)
{
int mid = (low + high) / 2;
if(a[i] >= dp[mid])
low = mid + 1;
else high = mid - 1;
}
t=low;
dp[t] = a[i];
}
}
其中max1为所求答案,dp数组用来存放每个数字从开头到本身最长的子数列,先用第一个if判断是否可以直接插入到最长子数列中,可以就直接将自己存放进去,否则用二分法判断下一个数,如果直接用for()循环会导致时间复杂度O(n*n)超限,最后则用dp存放当前数。
无了。。。今天花在这种怎么也看不明白的题上面太多时间了。。。。。。后面的题看了半天,,,可能受这题影响都没什么思路。。。。以后实在不会的建议上网搜题解,,,实在不会就跳过吧,,,哎~