java 多线程 传参 并发处理
众所周知,只要涉及多线程或者分布式,肯定是要处理传参和处理并发的问题。
1.传参
多线程的传参,和java里普通类的传参很类似,一般是两种方式,构造方法和set方法
1.1构造方法
public class Test02 {
public static void main(String[] args) {
R r = new R("mike");
Thread t = new Thread(r);
t.start();
}
}
class R implements Runnable{
private String name;
public R(String name){
this.name = name;
}
@Override
public void run() {
System.out.println("my name is:" + name);
}
}
执行结果:
my name is:mike
1.2set方法传参
public class Test02 {
public static void main(String[] args) {
R r = new R();
r.setName("mike");
Thread t = new Thread(r);
t.start();
}
}
class R implements Runnable{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println("my name is:" + name);
}
}
执行结果:
my name is:mike
两种方法都可以实现传参,看具体的场景来选择不同的方式传参。或者使用静态变量的方式,也能达到传参的效果
2.并发问题synchronization(锁,悲观锁):
synchronization块和synchronization方法,被锁所修饰的方法,只会允许一个线程进入方法,其他的都会陷入等待状态。
优点:可实现线程同步问题,且synchronization()的参数,可任意指定上锁的对象,灵活度高
缺点:若将一个大的方法修饰synchronization,大大影响效率,比如,若run()方法被synchronization修饰,由于在线程的整个生命周期内一直运行,会独占run方法,直到当前线程执行完毕,才会被下一个线程所进入。
lock(锁,乐观锁):
在多线程必然伴随着并发的问题。一般,我们都是使用synchronization(锁)来控制同时进入一条线程,
或者是使用lock方法(synchronization是自动释加锁释放锁,lock是手动加锁释放锁)。
当cs结构的时候,这样是比较稳妥的,但是,在bs架构下,每一个用户都拥有独自的实例,如果我们还是使用锁的方式或者Threadlocal,那几乎是没效用的。
这时候,我们可以使用别的思路了,比如考虑数据库或者项目文件来标识线程从而达到同时处理一个线程的理想状况。
为什么说是理想状态呢,因为辨别是否是一个线程依靠标示,而标示在标示的同时也是可能存在并发!
更多,请参考此大牛文字,Java 多线程 并发编程