/// 线程的资源访问冲突:多个线程同时申请一个资源,造成读写错乱。
/// 解决方案:上锁,lock{执行的程序段}:同一时刻,只允许一个线程访问该程序段。
/// 死锁问题:
/// 程序中的锁过多,某一线程需要多个锁资源,而某个资源被另一线程占用,另一个线程同样如此,(谁也不愿先释放资源)形成闭环,线程无法继续进行。
/// 解决方案:使用调度算法,让某一个被占用的资源被线程释放或关闭某个线程。
// 资源访问冲突
class State
{
private Object _lock = new Object();
private int state = 100;
private void test()
{
if(100 == state)
{
Console.Write("state=" + state);
}
state++;
}
private void test2()
{
if (101 == state)
{
Console.Write("state=" + state);
}
state++;
}
public void ChangeState()
{
Thread h = new Thread(test);
Thread v = new Thread(test2);
// h.Start();
// v.Start();
// state=100state=100state=101state=100请按任意键继续. . .
lock (_lock)
{
h.Start();
v.Start();
// state=100请按任意键继续. . .
// state=100state=101请按任意键继续. . .
}
}
}
// 主程序
class StateProgram
{
static void Main(string[] args)
{
State state = new State();
for (int i = 0; i
// 死锁
class Deadlock
{
Object _lock = new Object();
Object _lock2 = new Object();
private int flag = 0;
public void test()
{
lock (_lock)
{
Console.WriteLine("我拿到了锁1");
lock (_lock2)
{
Console.WriteLine("我拿到了锁2");
if(0 == flag)
{
Console.WriteLine("我是第一名");
flag = 1;
}
else
{
Console.WriteLine("我是第二名");
}
}
}
}
public void test2()
{
lock (_lock2)
{
Console.WriteLine("他拿到了锁2");
lock (_lock)
{
Console.WriteLine("他拿到了锁1");
if (0 == flag)
{
Console.WriteLine("他是第一名");
服务器托管网 flag = 1;
}
else
{
Console.WriteLine("他是第二名");
}
}
}
}
}
// 主程序
Deadlock star = new Deadlock();
Thread t1 = new Thread(star.test);
Thread t2 = new Thread(star.test2);
t1.Start();
t2.Start();
//我拿到了锁1
//他拿到了锁2
// 解决方案1:锁同步
class Deadlock
{
Object _lock = new Object();
Object _lock2 = new Object();
private int flag = 0;
public void test()
{
lock (_lock)
{
Console.WriteLine("我拿到了锁1");
lock (_lock2)
{
Console.WriteLine("我拿到了锁2");
服务器托管网 if(0 == flag)
{
Console.WriteLine("我是第一名");
flag = 1;
}
else
{
Console.WriteLine("我是第二名");
}
}
}
}
public void test2()
{
lock (_lock)
{
Console.WriteLine("他拿到了锁2");
lock (_lock2)
{
Console.WriteLine("他拿到了锁1");
if (0 == flag)
{
Console.WriteLine("他是第一名");
flag = 1;
}
else
{
Console.WriteLine("他是第二名");
}
}
}
}
}
我拿到了锁1
我拿到了锁2
我是第一名
他拿到了锁2
他拿到了锁1
他是第二名
请按任意键继续. . .
// 解决方案2:做标签
class Deadlock
{
Object _lock = new Object();
Object _lock2 = new Object();
private int flag = 0;
private int _flag = 0;
public void test()
{
if (0 == _flag)
{
lock (_lock)
{
Console.WriteLine("我拿到了锁1");
lock (_lock2)
{
Console.WriteLine("我拿到了锁2");
if (0 == flag)
{
Console.WriteLine("我是第一名");
flag = 1;
}
else
{
Console.WriteLine("我是第二名");
}
}
}
}
_flag = 1;
}
public void test2()
{
if(1 == _flag)
{
lock (_lock2)
{
Console.WriteLine("他拿到了锁2");
lock (_lock)
{
Console.WriteLine("他拿到了锁1");
if (0 == flag)
{
Console.WriteLine("他是第一名");
flag = 1;
}
else
{
Console.WriteLine("他是第二名");
}
}
}
}
}
}
Deadlock star = new Deadlock();
Thread t1 = new Thread(star.test);
Thread t2 = new Thread(star.test2);
t1.Start();
Thread.Sleep(1000);
t2.Start();
我拿到了锁1
我拿到了锁2
我是第一名
他拿到了锁2
他拿到了锁1
他是第二名
请按任意键继续. . .
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: XCode 4 Distribution App to AppStore
XCode 4 Distribution App to AppStore 刚刚用lion系统,装上了XCode 4.2,发布程序到AppStore时,发现用原来的步骤,却提示出错,查了一下相关文档,才明白XCode 4之后的变化。 1. iOS Pro…