Java线程同步问题 本帖最后由 gaoht 于 2010-08-05 10:44:18 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以使用Vector实现,Vector是线程同步的,你看看Api 定义一个全局静态变量 boolean is_writing当这个值为true时,不能读或者写,为false时,可以读和写当写线程要开始写东西时把这个值设置为true,写完之后再重新设置为false 简单的话,给读、写方法加synchronized关键字就可以做到,只是多个线程同时读时不是并发的,这样的好处是简单,如果只有一个CPU的话没有太大的影响。复杂的话,用synchronized, wait(), notifyAll()来做,以实现多个读线程并发。 用 synchronized关键字, public void method3(SomeObject so){ synchronized(so) { //….. } } 可以尝试用java.util.concurrent.locks.ReentrantReadWriteLock1.有时有些数据的改变是需要原子化的来保证数据的一致性(consistency)2.在这种情况下,对于并发的读操作体不应该有限制3.但是,当写操作体获得锁之后,任何读操作体就应该阻塞知道写操作完成来保证数据的一致性4.ReadWriteLock就是为此而生的5.如果没有写操作体拥有锁,许多读操作体都可获得锁 import java.util.ArrayList;import java.util.List;public class ListMain { //利用单子模式,将list设定为唯一 public static List<String> list; //设定写的线程数,每有一个写线程启动时,writerThreadCount+1; private int writerThreadCount=0; private static ListMain lm=new ListMain(); private ListMain() { list=new ArrayList<String>(); } public static ListMain getListMain(){ return lm; } public int getWriterThreadCount() { return writerThreadCount; } public void addWriterThreadCount() { this.writerThreadCount++; } public void minusWriterThreadCount() { this.writerThreadCount--; } public static void main(String[] args) { ListMain lm=ListMain.getListMain(); //判断写线程的个数,如果为2的话则退出循环 while(lm.getWriterThreadCount()<2){ new Thread(new ThreadWriter()).start(); lm.addWriterThreadCount(); } //每隔5秒钟起一个线程读取list中的元素 for(int i=0;;i++){ new Thread(new ThreadReader()).start(); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } }}public class ThreadWriter implements Runnable { private List<String> list; private BufferedReader br; private ListMain lm; public ThreadWriter() { this.list=ListMain.list; lm=ListMain.getListMain(); br=new BufferedReader(new InputStreamReader(System.in)); } public void run() { String str; try { while((str=br.readLine())!=null){ //将list加锁,当向list中添加数据时外部程序无法对list进行任何操作 synchronized (list) { list.add(str); } } } catch (IOException e) { lm.minusWriterThreadCount(); }finally{ try { br.close(); } catch (IOException e) { e.printStackTrace(); } } }}public class ThreadReader implements Runnable { private List<String> list; public ThreadReader() { this.list=ListMain.list; } public void run() { for(String al:list){ System.out.println("list中有数据:"+al); } }} String a=new String("3"+"4")创建了几个对象? ftp服务器接收到的命令有乱码问题 StringBuffer的capacity()方法 这种情况是包内还是包外? 100分求JDK1.4.2!! 怎么将文件反着读? 关于dbf文件的读写 做IT的就应该进来看看,成立我们的IT工会 连接SQLSERVER2000的问题 Orion是不是真的完全免费呀?(快来得分!) ScheduledExecutorService 定时查询 JNA返回值问题 求解
当这个值为true时,不能读或者写,为false时,可以读和写
当写线程要开始写东西时把这个值设置为true,写完之后再重新设置为false
复杂的话,用synchronized, wait(), notifyAll()来做,以实现多个读线程并发。
synchronized(so)
{
//…..
}
}
2.在这种情况下,对于并发的读操作体不应该有限制
3.但是,当写操作体获得锁之后,任何读操作体就应该阻塞知道写操作完成来保证数据的一致性
4.ReadWriteLock就是为此而生的
5.如果没有写操作体拥有锁,许多读操作体都可获得锁
import java.util.ArrayList;
import java.util.List;public class ListMain {
//利用单子模式,将list设定为唯一
public static List<String> list;
//设定写的线程数,每有一个写线程启动时,writerThreadCount+1;
private int writerThreadCount=0;
private static ListMain lm=new ListMain();
private ListMain() {
list=new ArrayList<String>();
}
public static ListMain getListMain(){
return lm;
}
public int getWriterThreadCount() {
return writerThreadCount;
}
public void addWriterThreadCount() {
this.writerThreadCount++;
}
public void minusWriterThreadCount() {
this.writerThreadCount--;
}
public static void main(String[] args) {
ListMain lm=ListMain.getListMain();
//判断写线程的个数,如果为2的话则退出循环
while(lm.getWriterThreadCount()<2){
new Thread(new ThreadWriter()).start();
lm.addWriterThreadCount();
}
//每隔5秒钟起一个线程读取list中的元素
for(int i=0;;i++){
new Thread(new ThreadReader()).start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}}
public class ThreadWriter implements Runnable {
private List<String> list;
private BufferedReader br;
private ListMain lm;
public ThreadWriter() {
this.list=ListMain.list;
lm=ListMain.getListMain();
br=new BufferedReader(new InputStreamReader(System.in));
} public void run() {
String str;
try {
while((str=br.readLine())!=null){
//将list加锁,当向list中添加数据时外部程序无法对list进行任何操作
synchronized (list) {
list.add(str);
}
}
} catch (IOException e) {
lm.minusWriterThreadCount();
}finally{
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}}
public class ThreadReader implements Runnable {
private List<String> list;
public ThreadReader() {
this.list=ListMain.list;
} public void run() {
for(String al:list){
System.out.println("list中有数据:"+al);
}
}}