在多线程对同一个函数进行调用时,如果不控制号锁的机制,往往就会产生数据混乱的情况,我们通常在控制线程的同步问题时,通常采用的方法:
1:使用synchronized进行控制访问。
2:使用ReentrantLock,进行上锁,方法体结束时进行解锁,因此得到控制。
下面我分别通过一个实例,来详细说明一下,上锁的方法,如果去掉锁机制之后,你会发现数据会出现混乱的情况。
代码语言:javascript复制import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class TraditionalThreadSynchronized {
public static void main(String[] args) {
TraditionalThreadSynchronized tt = new TraditionalThreadSynchronized();
tt.init();
}
public void init(){
final Outeputer out = new Outeputer();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
out.output2("robin222222222222222");
}}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
out.output2("Tcent111111111");
}}
}).start();
}
static class Outeputer{
Lock lock = new ReentrantLock();
public void output(String name){
synchronized (Outeputer.class) {
int len = name.length();
for(int i=0;i<len;i ){
System.out.print(name.charAt(i));
}
System.out.println();
}
}
public void output2(String name){
//lock.lock();//这里自行进行测试
int len = name.length();
for(int i=0;i<len;i ){
System.out.print(name.charAt(i));
}
System.out.println();
// lock.unlock();
}
public void output3(String name){
int len = name.length();
for(int i=0;i<len;i ){
System.out.print(name.charAt(i));
}
System.out.println();
}
}
}