导航:首页 > 编程语言 > java实现线程的同步

java实现线程的同步

发布时间:2022-03-09 13:20:41

java多线程有几种实现方法线程之间如何同步

Java多线程有两种实现方式:一种是继承Thread类,另一种是实现Runable接口,大同小异,推荐后者,因为实现接口的话这个类还可以实现别的接口和继承一个类,灵活性好,若继承Thread类之后,就无法继承其他类了。
至于实现同步,最简单的方法就是使用同步块,synchronized(){语句块}
当多个线程同时访问到同步语句块时,会由一个线程先获得对象锁,获取对象锁的线程执行完毕之后,释放锁,其他线程再次竞争锁,一个一个通过,不存在两个以上线程同时执行同步语句块的情况。

② Java如何实现多线程同步

//解决方案-1 设置3把锁, 然后把锁们应用到所有线程中 (涉及到synchronized wait notify等, 嫌麻烦. 略)
解决方案-2 设置3个全局共享的信号标记(信号灯) + 3子线程分别占用标记1 2 3
+ 主线程轮询/等待
(简洁明快 推荐)

//解决方案-2 实现如下:
static boolean t1_done = false;
static boolean t2_done = false;
static boolean t3_done = false;

//t1------run() { ............ ; t1_done = true; }
//t2、 3: 同理,略

main () { .............;
启动t1;
启动t2;
启动t3;

//轮询 or 等待
while ( true )
if ( t1_done && t2_done && t3_done) break;
else
Thread.yield () ;
// 或 Thread.sleep(xxxx) ----若子线程运行超过100ms以上,应予考虑

//轮询结束,主线程继续工作
} //main END

have fun

③ java (线程的同步与并发)

试试我改过的这个

class Mystack
{
int index=0;
private char[]date=new char [10];

public void push(char c)
{
synchronized(this)
{
if(index<10)
{
date[index]=c;
index++;
if(index==10)
notify();
}

else
{

try
{
System.out.println ("push wait");
wait();

}
catch(Exception e)
{
e.printStackTrace();
System.err.println(e);
}

}

}

}

public void pop()
{
synchronized(this)
{
if(index!=0)
{
if(index>9)
index--;
System.out.print ("B:pop");
System.out.println (date[index]);
index--;
if(index==0)
notify();

}
else
{
try
{
System.out.println ("pop wait");
wait();

}
catch(Exception e)
{
e.printStackTrace();
System.err.println (e);
}

}

}

}
}

class PushChar extends Thread
{
Mystack s;
char c;

PushChar(Mystack s)
{
this.s=s;
}

public void run()
{
System.out.println ("start push");
for (int i=0; i<20; i++)
{
c=(char)(Math.random()*26+'A');
s.push(c);

System.out.println("A:push "+c);

}
}

}
class PopChar extends Thread
{
Mystack s;
char c;

PopChar(Mystack s)
{
this.s=s;
}

public void run()
{
System.out.println ("start pop");
for(int j=0;j<20;j++)

s.pop();
}
}

public class Test
{
public static void main (String[] args)
{
Mystack s=new Mystack();
PushChar a=new PushChar(s);
PopChar b=new PopChar(s);
a.start();
b.start();
}
}

④ Java实现线程同步的几种方式

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

⑤ java采用什么机制实现多线程同步

thread(线程)、thread-safe(线程安全)、intercurrent(并发的)
synchronized(同步的)、asynchronized(异步的)、
volatile(易变的)、atomic(原子的)、share(共享)

⑥ JAVA 多线程同步概念

加入一个程序里的一个方法有以下输出,这两个输出需要一起执行:
println("第"+i+"个线程连接");
println("你好啊,"+i+"号");
然后有两个线程连调用了这个方法,分别叫他们1和2线程
本来我想要的输出应该是:
第1个线程连接
你好啊,1号
第2个线程连接
你好啊,2号
但是如果不加同步的话,极有可能导致如下输出:
第1个线程连接
第2个线程连接
你好啊,2号
你好啊,1号
这显然不是我想要的。

再比如银行系统,个人账户的存、取操作也应该是同步的
如果我的余额是10元,我想在线买一个15元的东西,我的余额不足,于是我充值5元,再消费15元。由于操作的目标都是余额属性,所以多线程不同步的情况下,极有可能是先执行了消费操作后执行存钱操作。这种情况下我的余额是不足的,导致操作不成功。但事实是,在他判定我余额的后一秒钟存钱动作执行了,其实我的余额是够的。这就导致了一个错误。

同步锁只是保证执行顺序,而不是说这一个方法大家在排队

⑦ Java 线程同步几种方式

(1)同步方法:
即有synchronized关键字修饰的方法。 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
(2)同步代码块
即有synchronized关键字修饰的语句块。被该关键字修饰的语句块会自动被加上内置锁,从而实现同步
(3)使用特殊域变量(Volatile)实现线程同步
a.volatile关键字为域变量的访问提供了一种免锁机制
b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新
c.因此每次使用该域就要重新计算,而不是使用寄存器中的值
d.volatile不会提供任何原子操作,它也不能用来修饰final类型的变量
(4)使用重入锁实现线程同步
在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。ReentrantLock类是可重入、互斥、实现了Lock接口的锁, 它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力。
(5)使用局部变量实现线程同步

⑧ 请问java怎么实现两个线程同步

靠,你这能叫同步吗,你还敢这边没写完那边就开始压缩啊。学东西都学死了,在多线程下去连死活都能并发了,一边死一边复活。

⑨ Java多线程同步同步代码块

票数弄多一些,休眠时间长一点,效果会好一些。

阅读全文

与java实现线程的同步相关的资料

热点内容
优信二手车解压后过户 浏览:62
Windows常用c编译器 浏览:778
关于改善国家网络安全的行政命令 浏览:833
安卓如何下载网易荒野pc服 浏览:654
javainetaddress 浏览:104
苹果4s固件下载完了怎么解压 浏览:1003
命令zpa 浏览:286
python编译器小程序 浏览:945
在app上看视频怎么光线调暗 浏览:540
可以中文解压的解压软件 浏览:593
安卓卸载组件应用怎么安装 浏览:913
使用面向对象编程的方式 浏览:340
程序员项目经理的年终总结范文 浏览:930
内衣的加密设计用来干嘛的 浏览:433
淮安数据加密 浏览:292
魔高一丈指标源码 浏览:982
松下php研究所 浏览:168
c回调java 浏览:401
梦幻端游长安地图互通源码 浏览:746
电脑本地文件如何上传服务器 浏览:314