重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
只有多个线程同时访问同一数据才会出现并发。单线程在方法中调用成员变量,她会按你书写顺序调用,不会并发!
我们一直强调成都网站设计、成都网站制作、外贸网站建设对于企业的重要性,如果您也觉得重要,那么就需要我们慎重对待,选择一个安全靠谱的网站建设公司,企业网站我们建议是要么不做,要么就做好,让网站能真正成为企业发展过程中的有力推手。专业网络公司不一定是大公司,创新互联建站作为专业的网络公司选择我们就是放心。
就算有并发也可以在方法中加入关键字synchronized。对线程加锁。(上网看下synchronized)
举个例子吧:同一个账号在不同取款机同时做取钱,就会出现账目数量不对。也就是并发问题!
我写个伪码
public class 银行业务{
private int 账号;
private synchronized String 取(账号){
..............
}
private synchronized String 存(账号){
..............
}
................................
}
以上伪码就是同一个账户当你作取或存的时候,其他取款机就不能对这个账号操作,否则线程并发账目就不对!!!!
给分啊………………哥哥………………加油啊……………………
先建一个用于下载文件的多线程类,通常要指明下载文件的位置(URL)和文件名以及保存到本地的路径
public class FileDownloader implements Runnable
{
private static File file;//要下载的文件
private static String url;//文件所在URL
private static File storagePath;//保存路径
public static void initialize(File file, String url, File storagePath)//初始化静态字段,初始化的代码不用我写吧
}
然后,指明同步块,目的是让各个线程共享一个文件资源,那样它们可以知道同一个文件的下载状况(即获取其他线程下载文件到哪个位置,以防重复下载)
public synchronized void fileDownload()//此方法用于下载文件,一般的Java程序员都会写,实在不会我可以帮你补上
或者
public void fileDownload(){
synchronized(file){
synchronized(url){
synchronized(storagePath){
}}}}//给每个字段加上同步块
run()方法的实现就以自己的喜好去写吧,只要里面调用了fileDownload()方法就行。
public void run(){
…
fileDownload();//下载文件
…
}
然后,在主类的main方法中创建一个多线程数组:
Runnable[] fds=new FileDownloader[线程数量];//fds为file_downloaders缩写
Thread[] threads=new Thread[线程数量];
最后使用循环把所有的线程逐一启动。
for(int i=0;i线程数量;i++){
threads[i]=new Thread(fds[i]);
threads[i].start();
}
public static void main(String[] args) {
for(Thread t:getThreads()){
t.start();
}
}
public static Thread[] getThreads(){
Thread[] thread = new Thread[10];
for(int i=0;i10;i++){
final Integer num = new Integer(i);
thread[i] = new Thread(new Runnable(){
public void run() {
int j=5;
while(j--0){
System.out.println("this is thread"+num);
}
}
});
}
return thread;
}
看你的描述,你是使用了类的成员变量,也就是static的静态变量是吧,你得这种情况最好的解决办法就是不用静态变量,改用实例成员变量,这样每一个对象各自都有各自的变量。当然如果你一定要用静态变量,那么你得程序就牵扯到线程安全问题了,你得多个线程,在争夺共有的资源(类静态变量)要么改成单线程,要么变成同步语句块或者同步方法,保证共有资源的锁定和可靠性。