共享内存的情况下,出现的高并发异常

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

共享内存的情况下,出现的⾼并发异常package thread;
public class TestShareMemory {
static String shareM = "";
static void alter(String tmp){
shareM = tmp;
}
static class GThread extends Thread {
public void run() {
for (int i = 1; i < 2222122; i++){
alter("GThread");
if("XThread".equals(shareM)){
System.out.println("GThread:"+shareM);}
}
}
}
static class XThread extends Thread {
public void run() {
for (int i = 1; i < 2221222; i++){
alter("XThread");
if("GThread".equals(shareM)){
System.out.println("XThread:"+shareM);}
}
}
}
public static void main(String[] args) {
Thread p2 = new XThread();
Thread p1 = new GThread();
p1.start();
p2.start();
}
}
普通情况下,是不会出现“GThread:XThread” 这种情况的,但是在上述⾼并发,并且共享内存的情况下就可能出现问题!
可以通过这样加锁:
package thread;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class TestShareMemory {
private static Lock lock = new ReentrantLock();
static String shareM = "";
static void alter(String tmp) {
shareM = tmp;
}
static class GThread extends Thread {
public void run() {
for (int i = 1; i < 2222122; i++) {
lock.lock();// 显⽰加锁
try {
alter("GThread");
if ("XThread".equals(shareM)) {
System.out.println("GThread:" + shareM);
}
} finally {
// 显⽰释放锁
lock.unlock();
}
}
}
}
static class XThread extends Thread {
public void run() {
for (int i = 1; i < 2221222; i++) {
lock.lock();// 显⽰加锁
try {
alter("XThread");
if ("GThread".equals(shareM)) {
System.out.println("XThread:" + shareM);
}
} finally {
// 显⽰释放锁
lock.unlock();
}
}
}
}
public static void main(String[] args) {
Thread p2 = new XThread();
Thread p1 = new GThread();
p1.start();
p2.start();
}
}
总结:在⾼并发并且有共享内存的情况下,有⼏个⽅法解决并发问题:
1、把共享内存的变量变成线程内部的变量。

(有时候是没必要线程共享变量)。

2、在必要线程共享变量的时候,对涉及到的读写共享变量的地⽅加锁。

相关文档
最新文档