java 线程小结
1, 为什么wait与notify之前必须要加synchronized?
答案其实很简单,也是为了防止等待-通知机制出现race condition
为什么会出现race condition ?
答: 对象在被wait之前已经被另一线程notify , 之后的wait 会永久停止,并导致deadlock(死锁)
理想情况:
1, 第一个线程判断该对象是否要wait
2, 第一个线程将对象wait
3, 第二个线程再将对象notify
实际情况
1, 第一个线程判断该对象是否要wait
2, 第二个线程将对象notify
3, 第一个线程将对象wait
为了防止这些情况,才需要在wait与notify之前加synchronized
java 代码
A a = A.getInstance();//单例对象,同一份实例不销毁
synchronized (a) {
a.wait();
}
-------------------------------另一线程
A a = A.getInstance();
synchronized(a) {
a.notify();
}
等待-通知机制必须与sychronized一起用,否则自身也会有 race condition.
2, 静态同步方法与非静态同步方法的区别
有时,我们经常会碰到这样的代码!
业务逻辑的封装类:
public class Logic {
private static final Log log = LogFactory.getLog(Logic.class);
private static Logic logic;
private Logic() {}
public static Logic getInstance() {
if (null == logic) {
logic = new Logic();
}
return logic;
}
public static synchronized void testStatic() {
log.info(Thread.currentThread().getName() + " : static method is running");
}
public synchronized void testNonStatic() {
log.info(Thread.currentThread().getName() + " : non static method is running");
}
}
非静态方法的执行:
public class ThreadRun1 extends Thread {
private static final Log log = LogFactory.getLog(ThreadRun1.class);
public void run() {
Logic logic = Logic.getInstance(); // object reference
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
log.error("some exceptions occured :", e);
}
logic.testNonStatic();
logEnd();
}
private void logEnd() {
log.info("thread ru
相关文档:
java 视频处理 ffmped+mencoder
转载自 http://huqilong.blog.51cto.com/53638/136985
ffmpeg+mencoder几乎可以完成目前基于web的播客平台任何音视频处理的操作.如果还需要添加一些什么的话,那么就是视频在线录制功能了,这个也可以用ffmpeg+fms来完成,因此一般的类似于YouTube的一些可见功能都可以在ffmpeg+menco ......
转自:
pconline:http://www.pconline.com.cn/pcedu/empolder/gj/java/0411/499156.html
好的东西转过来看看
由于网络带宽有限,所以数据文件的压缩有利于数据在Internet上的快速传输,同时也节省服务器的外存空间。
Java 1.1实现了I/O数据流与网络数据流的单一接口,因此数据的压缩、网络传输和解压缩的实现比较容易 ......
(1)栈
package ChapterOne;
public class Stack {
//栈数组
long stackArr[];
//栈的大小
int maxSize;
//栈的顶部
int top;
//初始化一个大小为size的栈
public Stack(int size){
maxSize = size;
stackArr = new long[size];
top = -1;
}
//出栈操作
public long pop(){
return sta ......