导航:首页 > 编程语言 > java多线程的同步问题

java多线程的同步问题

发布时间:2022-08-05 06:07:20

java中线程同步的几种方法

线程同步主要有以下种方法(示例中是实现计数的功能):

1、同步方法,即使用synchronized关键字修饰方法,例如:

publicsynchronizedvoidadd(intc){...}

2、同步代码块,即有synchronized关键字修饰的语句块,例如:

publicvoidaddAndGet(intc){
synchronized(this){
count+=c;
}
}

3、使用特殊域变量(volatile)实现线程同步,该方法不能保证绝对的同步。

例如:privatevolatileintcount=0;

4、使用锁实现线程同步,例如:

privateLocklock=newReentrantLock();
publicvoidadd(intc){
lock.lock();//上锁
try{
count+=c;
}finally{
lock.unlock();//解锁
}
}

5、使用原子变量实现线程同步,在java的util.concurrent.atomic包中提供了创建了原子类型变量的工具类,例如:

privateAtomicIntegercount=newAtomicInteger(1);
publicvoidadd(intc){
count.addAndGet(c);
}

6、使用局部变量实现线程同步,如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本, 副本之间相互独立,这样每一个线程都可以随意修改自己的变量副本,而不会对其他线程产生影响。

ThreadLocal 类的常用方法

new ThreadLocal<T>() : 创建一个线程本地变量

get() : 返回此线程局部变量的当前线程副本中的值

initialValue() : 返回此线程局部变量的当前线程的"初始值"

set(T value) : 将此线程局部变量的当前线程副本中的值设置为value

示例代码:

privatestaticThreadLocal<Integer>count=newThreadLocal<Integer>(){
@Override
protectedIntegerinitialValue(){
return1;
}
};

publicvoidadd(intc){
count.set(count.get()+c);
}

7、使用阻塞队列实现,例如LinkedBlockingQueue,具体使用可网络LinkedBlockingQueue的用法或查看java文档。

㈡ JAVA多线程同步问题

噢,是这样的,不是什么东西都能当做锁,你不能这样理解。
synchronized(obj),obj这里是你所在类的MIDlet的一个实例对象。

目的是解决因线程不同步而对数据造成破坏的问题。
假如:在一个类中有一个成员变量a,还有两个线程,如果线程不同步的话,这两个线程有可能同时访问同一个变量a,这样的话,就会出现问题,最后执的结果a到底是几呢,所以就要使用线程同步这个办法了。

使用线程同步后,线程1在访问a的时候,我加了一把锁,在这个时候别的线程是不允许访问a的,等线程1对a有访问结束后,就会去掉这把锁,其他的线程再访问a的时候,又会加锁,这样在同一时候,只能有一方访问a,这样就不会出现问题,我说这么多,你明白了吗?希望你能明白,不然我说的算白说了,呵呵!!!!

㈢ Java多线程服务器的同步问题

多线程之所以会出现同步问题,是因为多个线程可以共享资源,对同一资源进行操作,导致不一致的问题,你这个并没有对什么资源进行操作,不会有问题

㈣ Java如何处理多线程的数据同步问题

通过synchronize加锁进行实现进行之间的互斥、通过wait、notify方法实现线程之间的同步。

㈤ Java多线程同步的几种方式

java中多线程的实现方法有两种:1.直接继承thread类;2.实现runnable接口;同步的实现方法有五种:1.同步方法;2.同步代码块;3.使用特殊域变量(volatile)实现线程同步;4.使用重入锁实现线程同步;5.使用局部变量实现线程同步 。
其中多线程实现过程中需注意重写或者覆盖run()方法,而对于同步的实现方法中使用较常使用的是利用synchronized编写同步方法和代码块。
谢谢采纳!!

㈥ java多线程同步问题!

对于这个列子来说确实可以不用加资源同步锁,
其实只有对别的线程可能改变其它线程把持的对象的值的情况才要考虑是否需要同步锁,对于不会改变的情况一般不用考虑,这里的taskList 对象很可能被多个线程同时修改,所以考虑了同步锁,其实List对象的add永远也不会出现添加出错的情况,所以其实这里没什么必要加上同步锁。
而对象一旦加上同步锁,那么当某个线程获得该对象资源,那么该资源被锁定,只能由该线程可以操作,而Object.notify()方法是释放掉该资源,处于等待状态的其它线程可以获得该资源,如果不显示声明notify,当synchronized块执行完后会自动释放。

㈦ java多线程解决同步问题的几种方式,原理和代码

在Java中一共有四种方法支持同步,其中前三个是同步方法,一个是管道方法。管道方法不建议使用。

㈧ java多线程同步的问题

用连接池很好搞定,就是系统开销会大些,连接池的回收会有一些麻烦。

主进程

packageorg.test;
importjava.util.ArrayList;
importjava.util.List;
importjava.util.concurrent.ExecutionException;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;
importjava.util.concurrent.Future;
importjava.util.concurrent.TimeUnit;
importjava.util.concurrent.TimeoutException;
publicclassTestTheadPool{

publicstaticvoidmain(String[]args){

Future<String>future=null;//每次请求,返回的执行结果
ExecutorServicepool=Executors.newFixedThreadPool(3);//执行pool初始化线程3个分别用于做任务A,任务B,任务C
List<Future<String>>futureList=newArrayList<Future<String>>();//执行结果集

//异步请求调用A
futureList.add(pool.submit(newAsynProcessThread("A")));
//异步请求调用B
futureList.add(pool.submit(newAsynProcessThread("B")));
//异步请求调用C
futureList.add(pool.submit(newAsynProcessThread("C")));
try{
for(inti=0;i<futureList.size();i++){
StringtempResult="";

tempResult=futureList.get(i).get(30000,TimeUnit.MILLISECONDS);//设定超时时间


System.out.println("future["+i+"]result="+tempResult);
}
}catch(InterruptedExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(ExecutionExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(TimeoutExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
pool.shutdown();//这个连接池回收比较简单,没有考虑回收失败的情况。
}
//startprocessD
System.out.println("itisprocessDstart");

System.out.println("itisprocessDend");
}
}

异步线程类

packageorg.test;
importjava.util.Date;
importjava.util.concurrent.Callable;
<String>{

privateStringprocessType;

//构造器
publicAsynProcessThread(StringprocessType){
this.processType=processType;
}
@Override
publicStringcall()throwsException{
DatestartDate=newDate();
System.out.println("process"+processType+"start,time=["+startDate.getTime()+"]");
if("A".equals(processType)){
Thread.sleep(10000);//sleep10秒
}elseif("B".equals(processType)){
Thread.sleep(20000);//sleep20秒
}elseif("C".equals(processType)){
Thread.sleep(15000);//sleep15秒
}
DateendDate=newDate();
System.out.println("process"+processType+"end,time=["+endDate.getTime()+"]total=["+(endDate.getTime()-startDate.getTime())+"]");
return"SUCCESS";
}
}

㈨ JAVA多线程同步的问题

很简单,当不使用的时候,所有的线程都在运行这一个run,因为你没锁,也就是说没锁的听况下,看似只有一个runnable对象,一个run代码块,但是四个线程都在用,这相当于一个房间里面有100本书,是个人都可以同时进入拿,自然四个线程都参与,当你锁起来的时候就相当于一个人进入了就锁了门,其他人都进不去了,只有当那个人出来了,其他人才可以进去,但是,里面是死循环,知道书被那个人都装进麻袋了猜背出来,其他人进去了已经没有了,所以循环直接退出。这样就看似只有一个线程在执行了。

阅读全文

与java多线程的同步问题相关的资料

热点内容
农行app怎么开网银 浏览:649
java迭代器遍历 浏览:301
闽政通无法请求服务器是什么 浏览:48
怎么做积木解压神器 浏览:203
王者荣耀解压玩具抽奖 浏览:49
12位是由啥加密的 浏览:868
程序员编迷你世界代码 浏览:895
php取现在时间 浏览:246
单片机高吸收 浏览:427
怎么区分五代头是不是加密喷头 浏览:244
hunt测试服务器是什么意思 浏览:510
2013程序员考试 浏览:641
毕业论文是pdf 浏览:736
服务器跑网心云划算吗 浏览:471
单片机定时器计数初值的计算公式 浏览:801
win7控制台命令 浏览:567
猫咪成年app怎么升级 浏览:692
360有没有加密软件 浏览:315
清除cisco交换机配置命令 浏览:751
华为删除交换机配置命令 浏览:473