① 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多线程同步同步代码块
票数弄多一些,休眠时间长一点,效果会好一些。