在多线程对同一个函数进行调用时,如果不控制号锁的机制,往往就会产生数据混乱的情况,我们通常在控制线程的同步问题时,通常采用的方法:
1:使用synchronized进行控制访问。
2:使用ReentrantLock,进行上锁,方法体结束时进行解锁,因此得到控制。
下面我分别通过一个实例,来详细说明一下,上锁的方法,如果去掉锁机制之后,你会发现数据会出现混乱的情况。
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(); } } }
时间: 2024-10-13 14:18:06