13,347
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace TestSync
{
class Program
{
static void Main(string[] args)
{
List<Thread> allThreads = new List<Thread>();
for (int i = 0; i < 100; i++)
{
Thread aThread = new Thread(new ThreadStart(Program.ThreadA));
Thread bThread = new Thread(new ThreadStart(Program.ThreadB));
Thread cThread = new Thread(new ThreadStart(Program.ThreadRead));
allThreads.Add(aThread);
allThreads.Add(bThread);
allThreads.Add(cThread);
}
foreach (Thread item in allThreads)
{
item.Start();
}
Console.ReadLine();
}
/// <summary>
/// 设置CacheA,CacheB 为等差为2的数列。
/// </summary>
static void ThreadA()
{
Random r = new Random();
int a = r.Next(1000);
Thread.Sleep(a);
CacheA.me.SetResource12(a, a + 1);
CacheA.me.SetResource12(a + 2, a + 4);
CacheB.me.SetResource12(a + 6, a + 7);
CacheB.me.SetResource23(a + 8, a + 10);
}
/// <summary>
/// 设置CacheA,CacheB 为等差为3的数列。
/// </summary>
static void ThreadB()
{
Random r = new Random();
int a = r.Next(1000);
Thread.Sleep(a);
CacheA.me.SetResource12(a, a + 2);
CacheA.me.SetResource12(a + 3, a + 6);
CacheB.me.SetResource12(a + 9, a + 7);
CacheB.me.SetResource23(a + 12, a + 15);
}
static object lockObj = new object();
static void ThreadRead()
{
Random r = new Random();
int a = r.Next(1000);
Thread.Sleep(a);
lock (lockObj)
{
//要求显示等差为2的数列或者为等差为3的数列
Console.WriteLine(CacheA.me.ToString());
Console.WriteLine(CacheB.me.ToString());
}
}
}
public class CacheA
{
/// <summary>
/// 确保CacheA实例唯一,模拟内存资源
/// </summary>
public static readonly CacheA me = new CacheA();
private int resource1 = 0;
private int resource2 = 0;
private int resource3 = 0;
private CacheA()
{
}
public void SetResource12(int val1, int val2)
{
this.resource1 = val1;
Thread.Sleep(10);
this.resource2 = val2;
Thread.Sleep(10);
}
public void SetResource23(int val2, int val3)
{
this.resource2 = val2;
Thread.Sleep(10);
this.resource3 = val3;
Thread.Sleep(10);
}
public override string ToString()
{
return string.Format("CacheA R1:{0},R2:{1},R3:{2}", resource1, resource2, resource3);
}
}
public class CacheB
{
/// <summary>
/// 确保CacheB实例唯一,模拟内存资源
/// </summary>
public static readonly CacheB me = new CacheB();
private int resource1 = 0;
private int resource2 = 0;
private int resource3 = 0;
private CacheB()
{
}
public void SetResource12(int val1, int val2)
{
this.resource1 = val1;
Thread.Sleep(10);
this.resource2 = val2;
Thread.Sleep(10);
}
public void SetResource23(int val2, int val3)
{
this.resource2 = val2;
Thread.Sleep(10);
this.resource3 = val3;
Thread.Sleep(10);
}
public override string ToString()
{
return string.Format("CacheB R1:{0},R2:{1},R3:{2}", resource1, resource2, resource3);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace TestSync
{
class Program
{
static void Main(string[] args)
{
List<Thread> allThreads = new List<Thread>();
for (int i = 0; i < 100; i++)
{
Thread aThread = new Thread(new ThreadStart(Program.ThreadA));
Thread bThread = new Thread(new ThreadStart(Program.ThreadB));
Thread cThread = new Thread(new ThreadStart(Program.ThreadRead));
allThreads.Add(aThread);
allThreads.Add(bThread);
allThreads.Add(cThread);
}
foreach (Thread item in allThreads)
{
item.Start();
}
Console.ReadLine();
}
/// <summary>
/// 设置CacheA,CacheB 为等差为2的数列。
/// </summary>
static void ThreadA()
{
Random r = new Random();
int a = r.Next(1000);
Thread.Sleep(a);
try
{
CacheA.me.SetResource12(a, a + 1);
CacheA.me.SetResource23(a + 2, a + 4);
CacheB.me.SetResource12(a + 6, a + 7);
CacheB.me.SetResource23(a + 8, a + 10);
}
catch
{
}
}
/// <summary>
/// 设置CacheA,CacheB 为等差为3的数列。
/// </summary>
static void ThreadB()
{
Random r = new Random();
int a = r.Next(1000);
Thread.Sleep(a);
try
{
CacheA.me.SetResource12(a, a + 2);
CacheA.me.SetResource23(a + 3, a + 6);
CacheB.me.SetResource12(a + 9, a + 7);
CacheB.me.SetResource23(a + 12, a + 15);
}
catch
{
}
}
static object lockObj = new object();
static void ThreadRead()
{
Random r = new Random();
int a = r.Next(1000);
Thread.Sleep(a + 500);
lock (lockObj)
{
//要求显示等差为2的数列或者为等差为3的数列
Console.WriteLine(CacheA.me.ToString());
Console.WriteLine(CacheB.me.ToString());
}
}
}
public class CacheA
{
/// <summary>
/// 确保CacheA实例唯一,模拟内存资源
/// </summary>
public static readonly CacheA me = new CacheA();
private int resource1 = 0;
private int resource2 = 0;
private int resource3 = 0;
private CacheA()
{
}
public void SetResource12(int val1, int val2)
{
//模拟错误
Random r = new Random();
int a = r.Next(100);
if (a > 80)
{
throw new Exception("错误");
}
//设置值
this.resource1 = val1;
Thread.Sleep(10);
this.resource2 = val2;
Thread.Sleep(10);
}
public void SetResource23(int val2, int val3)
{
//模拟错误
Random r = new Random();
int a = r.Next(100);
if (a > 80)
{
throw new Exception("错误");
}
//设置值
this.resource2 = val2;
Thread.Sleep(10);
this.resource3 = val3;
Thread.Sleep(10);
}
public override string ToString()
{
return string.Format("CacheA R1:{0},R2:{1},R3:{2}", resource1, resource2, resource3);
}
}
public class CacheB
{
/// <summary>
/// 确保CacheB实例唯一,模拟内存资源
/// </summary>
public static readonly CacheB me = new CacheB();
private int resource1 = 0;
private int resource2 = 0;
private int resource3 = 0;
private CacheB()
{
}
public void SetResource12(int val1, int val2)
{
//模拟错误
Random r = new Random();
int a=r.Next(100);
if (a > 80)
{
throw new Exception("错误");
}
//设置值
this.resource1 = val1;
Thread.Sleep(10);
this.resource2 = val2;
Thread.Sleep(10);
}
public void SetResource23(int val2, int val3)
{
//模拟错误
Random r = new Random();
int a = r.Next(100);
if (a > 80)
{
throw new Exception("错误");
}
//设置值
this.resource2 = val2;
Thread.Sleep(10);
this.resource3 = val3;
Thread.Sleep(10);
}
public override string ToString()
{
return string.Format("CacheB R1:{0},R2:{1},R3:{2}", resource1, resource2, resource3);
}
}
}